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:
imagine: a grid of four pictures.upscale: you pick one of them.animatewith that upscale's hash. All four animations come back in one file. If you need just one, callupscaleonce more, this time with the animate task's hash andchoice1-4.
In animate itself, choice is either high or low, matching the High motion and Low motion buttons in Midjourney.
Request
/midjourney/v2/animateBase 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
| Field | Required | Description |
|---|---|---|
hash | Yes | Hash of a completed upscale task. |
choice | Yes | high or low: the motion level. |
webhook_url | No | Where we POST the task when its status changes. |
webhook_type | No | result: 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.
| status | What it means |
|---|---|
sent | we passed the task on for processing |
waiting | Midjourney accepted it and put it in the queue |
progress | it is running, progress goes from 0 to 100 |
done | finished, the output is in result |
error | failed, 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
| Method | Endpoint (POST /midjourney/v2…) | Input |
|---|---|---|
| Imagine | /imagine | prompt |
| Upscale | /upscale | hash of imagine / blend / describe / animate + choice 1-4 |
| Upsample (Subtle, Creative, 2x, 4x) | /upsample | hash of upscale |
| Variation | /variation | hash of imagine / describe / blend + choice 1-4 |
| Vary (Subtle) / Vary (Strong) | /vary-subtle, /vary-strong | hash of upscale |
| Reroll | /reroll | hash of a task |
| Animate (video) | /animate | hash of upscale + high / low |
| Inpaint (Vary Region) | /inpaint | hash of upscale + mask + prompt |
| Zoom Out | /zoom | hash of upscale + 50 / 75 or prompt |
| Pan | /pan | hash of upscale + direction |
| Blend | /blend | 2-5 image URLs |
| Describe | /describe | image URL |
| Seed | /seed | hash of a task |
| Upload | /upload | PNG / JPG file or URL |
| Info, Speed, Prefer (Remix) | /info, /speed, /prefer | account_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.