From midjourney-api-dev
Guides video/animation with client.animate, animate_from_image, extend_video, download_video — use when the user mentions animate, animation, 애니메이션, video, 비디오, i2v, image to video, extend video, 비디오 연장, download video, 비디오 다운로드, gif, motion
How this skill is triggered — by the user, by Claude, or both
Slash command
/midjourney-api-dev:midjourney-animateThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate videos from images, extend existing videos, and download results.
Generate videos from images, extend existing videos, and download results.
| Method | Input | Output | Description |
|---|---|---|---|
animate(job_id, index) | Grid job | Video Job | Animate from imagine grid |
animate_from_image(start) | Image file/URL | Video Job | Animate from uploaded image |
extend_video(job_id) | Video job | Video Job | Extend existing video |
download_video(job) | Video Job | list[Path] | Save to disk |
download_video_bytes(job) | Video Job | list[bytes] | In-memory bytes |
Create a video from a completed imagine grid image.
def animate(
self,
job_id: str,
index: int,
*,
prompt: str = "",
end_image: str | None = None,
motion: str | None = None,
batch_size: int = 1,
resolution: str = "480",
wait: bool = True,
poll_interval: float = 5,
timeout: float = 600,
mode: str = "fast",
stealth: bool = False,
) -> Job
| Param | Type | Default | Description |
|---|---|---|---|
job_id | str | -- | Completed imagine job ID |
index | int | -- | Grid image index (0-3) |
prompt | str | "" | Optional prompt text |
end_image | str | None | None | End frame file/URL (switches to start_end type) |
motion | str | None | None | Motion intensity: "low" or "high" |
batch_size | int | 1 | Number of video variations (--bs N) |
resolution | str | "480" | Video resolution: "480" or "720" |
stealth | bool | False | Private/stealth mode |
with MidjourneyClient() as client:
job = client.imagine("a cat walking")
# Basic animation from grid
video = client.animate(job.id, index=0)
# With motion and resolution
video = client.animate(job.id, index=1, motion="high", resolution="720")
# With end frame (start_end type)
video = client.animate(job.id, index=2, end_image="./end_frame.png")
# Download
paths = client.download_video(video)
| Condition | API Type |
|---|---|
end_image=None | vid_1.1_i2v_{res} |
end_image=<file/URL> | vid_1.1_i2v_start_end_{res} |
Create a video directly from an uploaded image file (no prior imagine job needed).
def animate_from_image(
self,
start_image: str,
end_image: str | None = None,
*,
motion: str | None = None,
prompt: str = "",
batch_size: int = 1,
resolution: str = "480",
wait: bool = True,
poll_interval: float = 5,
timeout: float = 600,
mode: str = "fast",
stealth: bool = False,
) -> Job
| Mode | end_image | API Type |
|---|---|---|
| Start only | None | vid_1.1_i2v_{res} |
| Start + End | "./end.png" or URL | vid_1.1_i2v_start_end_{res} |
| Start + Loop | "loop" | vid_1.1_i2v_start_end_{res} + loop |
with MidjourneyClient() as client:
# Start image only
video = client.animate_from_image("./start.png")
# Start + end image
video = client.animate_from_image("./start.png", end_image="./end.png")
# Loop mode (video loops back to start)
video = client.animate_from_image(
"./start.png", end_image="loop", motion="high",
)
# With batch
video = client.animate_from_image("./start.png", batch_size=3)
paths = client.download_video(video, batch_size=3)
Extend an existing video job (make it longer or guide it toward an end frame).
def extend_video(
self,
job_id: str,
index: int = 0,
*,
end_image: str | None = None,
motion: str | None = None,
prompt: str = "",
batch_size: int = 1,
resolution: str = "480",
wait: bool = True,
poll_interval: float = 5,
timeout: float = 600,
mode: str = "fast",
stealth: bool = False,
) -> Job
| Mode | end_image | API Type |
|---|---|---|
| Simple extend | None | vid_1.1_i2v_extend_{res} |
| Extend + End frame | "./frame.png" or URL | vid_1.1_i2v_start_end_{res} |
| Extend + Loop | "loop" | vid_1.1_i2v_start_end_{res} + loop |
with MidjourneyClient() as client:
job = client.imagine("a bird flying")
video = client.animate(job.id, index=0)
# Simple extend
extended = client.extend_video(video.id)
# Extend toward end frame
extended = client.extend_video(video.id, end_image="./landing.png")
# Extend with loop
extended = client.extend_video(video.id, end_image="loop")
# Extend with motion control
extended = client.extend_video(video.id, motion="low")
def download_video(
self,
job: Job,
output_dir: str = "./videos",
size: int | None = None,
batch_size: int = 1,
) -> list[Path]
def download_video_bytes(
self,
job: Job,
size: int | None = None,
batch_size: int = 1,
) -> list[bytes]
| Param | Type | Default | Description |
|---|---|---|---|
job | Job | -- | Completed video Job |
output_dir | str | "./videos" | Output directory |
size | int | None | None | Resolution (e.g., 1080 for social). None = original |
batch_size | int | 1 | Number of variations to download (match --bs N) |
# Download to disk
paths = client.download_video(video_job, "./output")
# -> ["./output/{job_id}_0.mp4"]
# With social resolution
paths = client.download_video(video_job, size=1080)
# -> ["./output/{job_id}_0_1080.mp4"]
# Batch download
paths = client.download_video(video_job, batch_size=3)
# -> 3 files
# In-memory bytes
data_list = client.download_video_bytes(video_job)
Video jobs have additional properties on the Job model:
job.is_video # bool: True if event_type contains "video"
job.event_type # str: e.g., "video_generation"
job.video_url() # str: CDN URL for MP4
job.gif_url() # str: CDN URL for GIF version
| Method | URL Pattern |
|---|---|
video_url() | cdn.midjourney.com/video/{job_id}/{index}.mp4 |
video_url(size=1080) | cdn.midjourney.com/video/{job_id}/{index}_{size}_N.mp4 |
gif_url() | cdn.midjourney.com/video/{job_id}/{index}_N.gif |
These apply to animate, animate_from_image, and extend_video:
| Param | Values | Description |
|---|---|---|
motion | "low", "high", None | Motion intensity |
batch_size | 1-4 | Number of variations (--bs N) |
resolution | "480", "720" | Video resolution |
stealth | True/False | Private mode |
with MidjourneyClient() as client:
# 1. Generate base image
job = client.imagine("a serene lake at dawn")
# 2. Animate from grid
video = client.animate(job.id, index=0, motion="low", resolution="720")
# 3. Extend the video
extended = client.extend_video(video.id, motion="low")
# 4. Download
paths = client.download_video(extended, "./output", size=1080)
from midjourney_api.api import MidjourneyAPI
# animate from grid
job = api.submit_animate(job_id, index=0, motion="high", resolution="720")
# animate from image file
job = api.submit_animate_from_image(start_url, end_url=None, motion="low")
# extend video
job = api.submit_extend_video(job_id, index=0, end_url="loop")
npx claudepluginhub juyeongyi/jylee_claude_marketplace --plugin midjourney-api-devCreates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.