Midjourney /describe Command
October 27, 2025
Table of contents
Generate text prompts from an image using Midjourney’s /describe command. Returns 4 prompt suggestions.
https://api.useapi.net/v3/midjourney/jobs/describe
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
{
"imageUrl": "https://example.com/image.jpg",
"stream": true,
"replyUrl": "https://your-server.com/webhook"
}
Parameters
-
channelis optional. Discord channel ID to use. See GET /accounts for configured channels. If not provided, API automatically selects available channel with capacity. Specify when you want to use a specific configured channel. imageUrlORimageBlobis required (mutually exclusive).imageUrl- URL to imageimageBlob- Image file upload, useContent-Type: multipart/form-data.
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.
Responses
-
Real-time SSE streaming (
stream: true)Returns
Content-Type: text/event-streamwith live events. See SSE Event Format for details. -
Job created successfully.
{ "jobid": "j1023...", "verb": "describe", "status": "created", "request": { "imageUrl": "https://example.com/image.jpg", "stream": false } } -
{ "error": "Either imageUrl or imageBlob is required" } -
{ "error": "Unauthorized" } -
{ "error": "Account has no subscription or subscription expired" } -
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
-
# With URL curl -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -X POST "https://api.useapi.net/v3/midjourney/jobs/describe" \ -d '{"imageUrl":"https://example.com/image.jpg","stream":true}' # With file upload curl -H "Authorization: Bearer YOUR_API_TOKEN" \ -F "[email protected]" \ -F "stream=true" \ "https://api.useapi.net/v3/midjourney/jobs/describe" -
// With URL const response = await fetch('https://api.useapi.net/v3/midjourney/jobs/describe', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_API_TOKEN', 'Content-Type': 'application/json' }, body: JSON.stringify({ imageUrl: 'https://example.com/image.jpg', stream: true }) }); // With file upload const formData = new FormData(); formData.append('imageBlob', fileInput.files[0]); formData.append('stream', 'true'); const response2 = await fetch('https://api.useapi.net/v3/midjourney/jobs/describe', { method: 'POST', headers: {'Authorization': 'Bearer YOUR_API_TOKEN'}, body: formData }); -
import requests # With URL response = requests.post( 'https://api.useapi.net/v3/midjourney/jobs/describe', headers={'Authorization': 'Bearer YOUR_API_TOKEN'}, json={'imageUrl': 'https://example.com/image.jpg', 'stream': True} ) # With file upload files = {'imageBlob': open('image.jpg', 'rb')} data = {'stream': 'true'} response2 = requests.post( 'https://api.useapi.net/v3/midjourney/jobs/describe', headers={'Authorization': 'Bearer YOUR_API_TOKEN'}, files=files, data=data )