Execute Midjourney Buttons

October 27, 2025

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. 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. If channel has default replyUrl configured, it will be used when job-specific one is not provided. All job events POST-ed to this URL as they occur.
    Overrides channel-level replyUrl if specified.
    Maximum length 1024 characters.

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

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