API method

Midjourney video through the API

Video in Midjourney is made from an image, and the API works the same way. You take an upscaled picture, call animate and get four short animations of it.

Updated

The chain of calls

From prompt to video it is three requests:

  1. imagine: a grid of four pictures.
  2. upscale: you pick one of them.
  3. animate with that upscale's hash. All four animations come back in one file. If you need just one, call upscale once more, this time with the animate task's hash and choice 1-4.

In animate itself, choice is either high or low, matching the High motion and Low motion buttons in Midjourney.

Request

POST/midjourney/v2/animate

Base URL is https://api.userapi.ai. Every request needs two headers, api-key and Content-Type: application/json.

{
"hash": "9701f416-b648-4f37-b432-edaa6f77662d",
"choice": "high",
"webhook_url": "https://example.com/animate/webhook-url",
"webhook_type": "result"
}

Parameters

FieldRequiredDescription
hashYesHash of a completed upscale task.
choiceYeshigh or low: the motion level.
webhook_urlNoWhere we POST the task when its status changes.
webhook_typeNoresult: one call at the end (done or error). progress: also every progress update.

What comes back

The response is just the task hash, e.g. {"hash": "ed162774-9244-4038-bdf1-801b033809ec"}. The finished task is what you later get from GET /midjourney/v2/status?hash=… or in the webhook:

{
"account_hash": "fbf3c9ea-155a-48e6-bbc0-2b3102c64d79",
"hash": "ed162774-9244-4038-bdf1-801b033809ec",
"parent_hash": "9701f416-b648-4f37-b432-edaa6f77662d",
"choice": "high",
"type": "animate",
"progress": 100,
"status": "done",
"result": {
"url": "https://cdn.discordapp.com/attachments/...b2c36b.webp",
"proxy_url": "https://media.discordapp.net/attachments/...b2c36b.webp",
"filename": "...b2c36b.webp",
"content_type": "image/webp",
"width": 560,
"height": 704,
"size": 802244
},
"job_id": "385f202d-16a5-4472-90e5-14b72bb2c36b",
"next_actions": [
{ "type": "upscale", "choices": [1, 2, 3, 4] },
{ "type": "reroll" }
],
"status_reason": null,
"created_at": "2025-08-01T13:12:33Z"
}

parent_hash is the upscale you animated. next_actions tells you what can be done with the result: upscale one of the four (1-4) or reroll.

statusWhat it means
sentwe passed the task on for processing
waitingMidjourney accepted it and put it in the queue
progressit is running, progress goes from 0 to 100
donefinished, the output is in result
errorfailed, see status_reason

Example with cURL

1. Prompt

curl -X POST https://api.userapi.ai/midjourney/v2/imagine \
-H "Content-Type: application/json" \
-H "api-key: $USERAPI_KEY" \
-d '{"prompt": "a paper boat sailing on a rainy street, cinematic"}'

2. Wait for the grid, upscale one picture

When the status is done, upscale the one you like:

curl "https://api.userapi.ai/midjourney/v2/status?hash=IMAGINE_HASH" \
-H "api-key: $USERAPI_KEY"
curl -X POST https://api.userapi.ai/midjourney/v2/upscale \
-H "Content-Type: application/json" \
-H "api-key: $USERAPI_KEY" \
-d '{"hash": "IMAGINE_HASH", "choice": 1}'

3. Animate

curl -X POST https://api.userapi.ai/midjourney/v2/animate \
-H "Content-Type: application/json" \
-H "api-key: $USERAPI_KEY" \
-d '{"hash": "UPSCALE_HASH", "choice": "low"}'

4. One animation separately

result.url of the animate task contains all four. To get, say, the second one on its own:

curl -X POST https://api.userapi.ai/midjourney/v2/upscale \
-H "Content-Type: application/json" \
-H "api-key: $USERAPI_KEY" \
-d '{"hash": "ANIMATE_HASH", "choice": 2}'

Wrappers for Python, Node.js and PHP are on separate pages. If you'd rather not write code, the same methods are available in n8n and Make. This method in the documentation.

Other methods

MethodEndpoint (POST /midjourney/v2…)Input
Imagine/imagineprompt
Upscale/upscalehash of imagine / blend / describe / animate + choice 1-4
Upsample (Subtle, Creative, 2x, 4x)/upsamplehash of upscale
Variation/variationhash of imagine / describe / blend + choice 1-4
Vary (Subtle) / Vary (Strong)/vary-subtle, /vary-stronghash of upscale
Reroll/rerollhash of a task
Animate (video)/animatehash of upscale + high / low
Inpaint (Vary Region)/inpainthash of upscale + mask + prompt
Zoom Out/zoomhash of upscale + 50 / 75 or prompt
Pan/panhash of upscale + direction
Blend/blend2-5 image URLs
Describe/describeimage URL
Seed/seedhash of a task
Upload/uploadPNG / JPG file or URL
Info, Speed, Prefer (Remix)/info, /speed, /preferaccount_hash

Try it on 50 free requests

Register, add a Discord account that has Midjourney, and you get an API key. The first 50 requests are free and you don't need to enter a card. Since 2023 more than 10,000 people have signed up and sent over 8 million requests through the API.

Questions

Does Midjourney have a video API?

Not an official one, Midjourney has no public API at all. Our animate method runs Animate on your Discord account and returns the result over REST or a webhook.

Can I animate my own picture?

Not directly: animate takes the hash of an upscale task, so the picture has to come out of Midjourney first. Put the image URL at the start of the imagine prompt (about 15% of prompts sent through our API do this), or blend your images, then upscale and animate the result.

high or low?

Same as High motion and Low motion in Midjourney. low is for calm scenes, high when you want the camera and the subject to move a lot. Through our API high is chosen about two times out of three.

Why four animations in one file?

That is how Midjourney returns them, like a grid of images. upscale with the animate hash and choice 1-4 gives you one.

How much is one video?

animate is one request: $0.04 on pay-per-request, nothing extra on a monthly plan. Plus the GPU time of your Midjourney plan.

See also

Use image generation Magic with UserAPI