Execute Midjourney Buttons
October 27, 2025
Table of contents
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
API tokenis required, see Setup useapi.net for details.
Request Body
{
"jobId": "j1023141520123456789i-u12345-c1234567890123456789-bot:midjourney",
"button": "U1",
"stream": true,
"replyUrl": "https://your-server.com/webhook",
"replyRef": "your-reference-id"
}
Parameters
-
jobIdis required. Parent job ID from completed imagine/button job. Must be a valid v3 job ID format. Parent job must havestatus: "completed". -
buttonis required. Button label to execute from the parent job’sresponse.buttonsarray. Only buttons available in completed parent job can be used. See Supported Buttons below. -
maskis optional. Required only forVary (Region)button. See Vary Region Mask Editor for details. -
promptis optional. Required forCustom Zoombutton. 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. streamis optional (default:true).true- ReturnsContent-Type: text/event-streamwith live progress events. See SSE Streaming Guidefalse- ReturnsContent-Type: application/jsonwith initial job state. Use GET /jobs/jobidto retrieve updates and results
-
replyUrlis optional. Webhook URL for real-time job event callbacks. If channel has defaultreplyUrlconfigured, it will be used when job-specific one is not provided. All job events POST-ed to this URL as they occur.
Overrides channel-levelreplyUrlif specified.
Maximum length 1024 characters. replyRefis optional. Your reference ID stored with job.
Returned in all responses and callbacks asresponse.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 imagesMake Variations- Create variationsVary (Strong)- Strong variationVary (Subtle)- Subtle variationVary (Region)- Regional variation (requiresmaskparameter)
Zoom:
Zoom Out 1.5x- Zoom out 1.5xZoom Out 2x- Zoom out 2xCustom Zoom- Custom zoom (prompts for parameters)
Pan:
⬅️,➡️,⬆️,⬇️- Pan in direction
Upscale Quality:
Upscale (2x),Upscale (4x)- Upscale resolutionUpscale (Subtle),Upscale (Creative)- Upscale variantsRedo Upscale (2x),Redo Upscale (4x)- Redo upscaleRedo Upscale (Subtle),Redo Upscale (Creative)- Redo upscale variants
Video:
Animate (Low motion),Animate (High motion)- Animate imageExtend (Low motion),Extend (High motion)- Extend video
Other:
🔄- Reroll (regenerate with same prompt)Make Square- Make image squareRemaster- Remaster image
Responses
-
Real-time SSE streaming (
stream: true)Returns
Content-Type: text/event-streamwith live events. See SSE Event Format for details. -
Execute-once button (U1-U4) already executed - returning existing child job.
{ "jobid": "j1023141525987654321i-u12345-c1234567890123456789-bot:midjourney", "verb": "button", "status": "completed", "created": "2025-10-23T14:15:25.987Z", "updated": "2025-10-23T14:16:30.123Z", "request": { "jobId": "j1023141520123456789i-u12345-c1234567890123456789-bot:midjourney", "button": "U1" }, "response": { "attachments": [{"url": "https://cdn.discordapp.com/..."}] } }Note: U1-U4 buttons return existing child job on subsequent executions (no 409 error).
-
New button job created (
stream: false).{ "jobid": "j1023141525987654321i-u12345-c1234567890123456789-bot:midjourney", "verb": "button", "jobType": "image", "status": "created", "created": "2025-10-23T14:15:25.987Z", "updated": "2025-10-23T14:15:25.987Z", "request": { "jobId": "j1023141520123456789i-u12345-c1234567890123456789-bot:midjourney", "button": "U1", "stream": false } } -
{ "error": "jobId is required" } -
{ "error": "Unauthorized" } -
{ "error": "Account has no subscription or subscription expired" } -
{ "error": "Parent job not found" } -
Parent job is older than 62 days.
{ "error": "Parent job has expired" } -
Channel at capacity or rate limited. Wait 10-30 seconds and retry.
{ "error": "Channel 1234567890123456789 is busy executing 3 image jobs" } -
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." }
Model
See Job Response Model for complete response structure.
Examples
-
curl -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -X POST "https://api.useapi.net/v3/midjourney/jobs/button" \ -d '{"jobId":"j1023...","button":"U1","stream":true}' -
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: true }) }); -
import requests response = requests.post( 'https://api.useapi.net/v3/midjourney/jobs/button', headers={'Authorization': 'Bearer YOUR_API_TOKEN'}, json={'jobId': 'j1023...', 'button': 'U1', 'stream': True} )