Midjourney support was discontinued on June 24, 2026. See the service notice for details — including how to cancel your subscription or request a prorated refund.

Midjourney V7 image generation is still available through the MiniMax API — see Midjourney V7 via MiniMax for examples and pricing.

Execute Midjourney Buttons

October 27, 2025 (February 19, 2026)

Table of contents

  1. Request Headers
  2. Request Body
  3. Parameters
  4. Supported Buttons
  5. Response • JSON • stream: false
  6. Response • SSE Stream • stream: true
  7. Model
  8. Examples
  9. Try It

Execute button actions on completed Midjourney jobs (upscale, variations, zoom, pan, reroll, etc.).

Execute-Once Pattern: U1-U4 upscale buttons can only be executed once per job. Subsequent requests return the existing child job immediately.

https://api.useapi.net/v3/midjourney/jobs/button

Request Headers

Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data (required for Blob content uploads).
# Content-Type: multipart/form-data

Request Body

{
  "jobId": "j1023141520123456789i-u12345-c1234567890123456789-bot:midjourney",
  "button": "U1",
  "stream": true,
  "replyUrl": "https://your-server.com/webhook",
  "replyRef": "your-reference-id"
}

Parameters

  • jobId is required. Parent job ID from completed imagine/button job. Must be a valid v3 job ID format. Parent job must have status: "completed".

  • button is required. Button label to execute from the parent job’s response.buttons array. Only buttons available in completed parent job can be used. See Supported Buttons below.

  • mask is optional. Required only for Vary (Region) button, must be base64-encoded WebP format. See Vary Region Mask Editor for details.

  • prompt is optional. Required for Custom Zoom button. When Remix mode is active, variation buttons (V1, V2, V3, V4, Vary (Region), Vary (Strong), Vary (Subtle)), pan buttons (⬅️, ➡️, ⬆️, ⬇️), and 🔄 (Reroll) also accept a prompt. If not provided, the original prompt will be used.

  • stream is optional (default: true).
    • true - Returns Content-Type: text/event-stream with live progress events. See SSE Streaming Guide
    • false - Returns Content-Type: application/json with initial job state. Use GET /jobs/jobid to retrieve updates and results
  • replyUrl is optional. Webhook URL for real-time job event callbacks. All job events POST-ed to this URL as they occur. Maximum length 1024 characters. Callback body has the same JSON shape as GET /jobs/jobid response.

  • replyRef is optional. Your reference ID stored with job. Returned in all responses and callbacks as response.replyRef. Maximum length 1024 characters.

  • replyLevel is optional (default: all). Controls which status changes trigger webhook callbacks.
    • all - Every status change (created, started, progress, completed, failed, moderated)
    • standard - Job lifecycle only (created + final states, no progress updates)
    • minimal - Final outcome only (completed, failed, moderated)

Note: Button job executes in the same channel as the parent job.

Supported Buttons

Upscale (Execute-Once):

  • U1, U2, U3, U4 - Upscale one of four grid images
  • Note: Can only be executed once per parent job. Subsequent requests return existing child job.

Variations:

  • V1, V2, V3, V4 - Create variations of one of four grid images
  • Make Variations - Create variations
  • Vary (Strong) - Strong variation
  • Vary (Subtle) - Subtle variation
  • Vary (Region) - Regional variation (requires mask parameter)

Zoom:

  • Zoom Out 1.5x - Zoom out 1.5x
  • Zoom Out 2x - Zoom out 2x
  • Custom Zoom - Custom zoom (prompts for parameters)

Pan:

  • ⬅️, ➡️, ⬆️, ⬇️ - Pan in direction

Upscale Quality:

  • Upscale (2x), Upscale (4x) - Upscale resolution
  • Upscale (Subtle), Upscale (Creative) - Upscale variants
  • Redo Upscale (2x), Redo Upscale (4x) - Redo upscale
  • Redo Upscale (Subtle), Redo Upscale (Creative) - Redo upscale variants

Video:

  • Animate (Low motion), Animate (High motion) - Animate image
  • Extend (Low motion), Extend (High motion) - Extend video

Other:

  • 🔄 - Reroll (regenerate with same prompt)
  • Make Square - Make image square
  • Remaster - Remaster image

Response • JSON • stream: false

Response with content-type: application/json.

  • 200 OK

    Execute-once button (U1-U4) already executed - returning existing child job.

    Note: U1-U4 buttons return existing child job on subsequent executions (no 409 error).

  • 201 Created

    New button job created. Use returned jobid with GET /jobs/jobid to poll status, or wait for webhook callbacks if replyUrl provided.

    {
        "jobid": "j1024182422328516474i-u12345-c1234567890987654321-bot:midjourney",
        "verb": "button",
        "jobType": "image",
        "status": "created",
        "created": "2025-10-24T18:24:22.340Z",
        "request": {
            "replyUrl": "https://api-callback.matthieu.leblanc.workers.dev/",
            "replyRef": "2025-10-24T18:24:21.243Z",
            "stream": false,
            "button": "U1",
            "jobId": "j1024181441023299840i-u12345-c1234567890987654321-bot:midjourney"
        }
    }
    
  • 400 Bad Request

    {
      "error": "jobId is required"
    }
    
  • 401 Unauthorized

    {
      "error": "Unauthorized"
    }
    
  • 402 Payment Required

    {
      "error": "Account has no subscription or subscription expired"
    }
    
  • 404 Not Found

    {
      "error": "Parent job not found"
    }
    
  • 410 Gone

    Parent job is older than 62 days.

    {
      "error": "Parent job has expired"
    }
    
  • 429 Too Many Requests

    Channel at capacity or rate limited. Wait 10-30 seconds and retry.

    {
      "error": "Channel 1234567890123456789 is busy executing 3 image jobs"
    }
    
  • 596 Pending Moderation

    Channel has pending moderation/CAPTCHA. Email notification sent. Log into Discord and address moderation message/CAPTCHA. Execute POST /accounts/channel/reset.

    {
      "error": "All configured Midjourney channels (2) have errors (pending moderation, CAPTCHA, etc.). Please resolve channel issues before making new requests."
    }
    

Response • SSE Stream • stream: true

Returns content-type: text/event-stream with real-time job progress events. See SSE Streaming Guide for implementation details. See Job Response Model for complete job response object structure.

data: {"event":"initialized","message":"Stream initialized","jobId":"j1024182444310873122i-u12345-c1234567890987654321-bot:midjourney","seq":0,"ts":"18:24:44.373"}

data: {"event":"midjourney_created","job":{"jobid":"j1024182444310873122i-u12345-c1234567890987654321-bot:midjourney","verb":"button","jobType":"image","status":"created","created":"2025-10-24T18:24:44.325Z","request":{"replyUrl":"https://api-callback.matthieu.leblanc.workers.dev/","replyRef":"2025-10-24T18:24:43.248Z","button":"U2","jobId":"j1024181441023299840i-u12345-c1234567890987654321-bot:midjourney"},"updated":"2025-10-24T18:24:45.449Z"},"seq":12,"ts":"18:24:45.474"}

data: {"event":"midjourney_progress","job":{"jobid":"j1024182444310873122i-u12345-c1234567890987654321-bot:midjourney","verb":"button","jobType":"image","status":"progress","created":"2025-10-24T18:24:44.325Z","request":{"replyUrl":"https://api-callback.matthieu.leblanc.workers.dev/","replyRef":"2025-10-24T18:24:43.248Z","button":"U2","jobId":"j1024181441023299840i-u12345-c1234567890987654321-bot:midjourney"},"updated":"2025-10-24T18:24:46.039Z","response":{"content":"Upscaling image #2 with **cat in the hat --v 7.0 --s 250** - <@9876543210123456789> (Waiting to start)"}},"seq":14,"ts":"18:24:46.050"}

data: {"event":"midjourney_completed","job":{"jobid":"j1024182444310873122i-u12345-c1234567890987654321-bot:midjourney","verb":"button","jobType":"image","status":"completed","created":"2025-10-24T18:24:44.325Z","request":{"replyUrl":"https://api-callback.matthieu.leblanc.workers.dev/","replyRef":"2025-10-24T18:24:43.248Z","button":"U2","jobId":"j1024181441023299840i-u12345-c1234567890987654321-bot:midjourney"},"updated":"2025-10-24T18:24:47.155Z","response":{"content":"**cat in the hat --v 7.0 --s 250** - Image #2 <@9876543210123456789>","attachments":[{"url":"https://cdn.discordapp.com/attachments/1234567890987654321/123456789098765027/matthieu_leblanc_975_cat_in_the_hat_xxxxxxxx-xxxx-xxxx-xxxx-e994e697adb0.png","width":1024,"height":1024}],"buttons":["Upscale (Subtle)","Upscale (Creative)","Vary (Subtle)","Vary (Strong)","Vary (Region)","Zoom Out 2x","Zoom Out 1.5x","Custom Zoom","⬅️","➡️","⬆️","⬇️","Animate (High motion)","Animate (Low motion)"]},"code":200},"seq":17,"ts":"18:24:47.170"}

Model

See Job Response Model for complete response structure.

Examples

The examples below show the JSON response format (stream: false). For real-time SSE streaming examples, see the SSE Streaming Guide.

  • curl -H "Authorization: Bearer YOUR_API_TOKEN" \
         -H "Content-Type: application/json" \
         -X POST "https://api.useapi.net/v3/midjourney/jobs/button" \
         -d '{"jobId":"j1023141520123456789i-u12345-c1234567890123456789-bot:midjourney","button":"U1","stream":false}'
    
  • const response = await fetch('https://api.useapi.net/v3/midjourney/jobs/button', {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer YOUR_API_TOKEN',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        jobId: 'j1023141520123456789i-u12345-c1234567890123456789-bot:midjourney',
        button: 'U1',
        stream: false
      })
    });
    
    const result = await response.json();
    console.log('Job created:', result.jobid);
    
    // Poll for completion using GET /jobs/jobid
    // Or use webhook with replyUrl parameter
    
  • import requests
    
    response = requests.post(
        'https://api.useapi.net/v3/midjourney/jobs/button',
        headers={'Authorization': 'Bearer YOUR_API_TOKEN'},
        json={
            'jobId': 'j1023141520123456789i-u12345-c1234567890123456789-bot:midjourney',
            'button': 'U1',
            'stream': False
        }
    )
    
    result = response.json()
    print('Job created:', result['jobid'])
    
    // Poll for completion using GET /jobs/jobid
    // Or use webhook with replyUrl parameter
    

Try It