Spritesheets

Animate a sprite through up to three fixed keyframes - initial_image, middle_image and final_image (each a URL or base64) - producing a spritesheet that interpolates through the provided frames in order. At least one of initial_image or middle_image is required (a final_image alone has nothing to anchor the animation); any keyframe may be omitted. The motion_prompt is optional here - when omitted, the motion is derived purely from the keyframes. Runs on hydra (default; also returns `audio_url`), forge, or forge-pixel for pixel-art sprites - the models that support a middle keyframe; any other model returns HTTP 400. For just a start and end frame, animateSprite with `final_image` does the same job. The job result is the same sprite result as animateSprite (`spritesheet_url`, `video_url`, grid fields, optional GIF and frame URLs, `audio_url` on hydra). Credits are held when the job is accepted; the final charge is max(rate × produced seconds, the model's minimum charge), never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. Use animateSprite instead for the classic single-image + text-prompt animation. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type spritesheet). Requires an API key (user scope). The call returns 202 with a job id - poll getApiJob (pass wait 30 to long-poll) honouring poll_after_ms, until status is succeeded; its result field is exactly the response documented for this operation. Synchronous responses are deprecated but still supported: pass `async: false` to block until the result is ready and receive it as the response body. Synchronous calls run on the same queue: the response carries an X-Ludo-Job-Id header, and a job still running after 15 minutes comes back as 202 with the job instead of an error. Each account may have up to 50 generations queued or running at once via the API; a request beyond that returns 429 (code PENDING_JOBS_LIMIT).

post/assets/sprite/animate-keyframes

Request body

motion_promptstring

Optional text description of the desired animation, e.g. "walking", "attack slash". When omitted, the motion is derived purely from the keyframes. When provided, describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them. Do not over-describe, though: too much detail can harm the animation, and an action the model already knows should be named, not decomposed into its steps ("walking", never "move the left foot forward, then the right foot"). Do not restate what the keyframes already show (the character, its appearance and equipment, the art style, the background, the lighting, the camera), and leave frame count and timing to the frames and duration fields. Negative phrasing ("no background", "do not move the camera", "without a weapon") works only on hydra. On forge and forge-pixel it backfires: naming something you do not want makes it more likely to appear, so "without a weapon" tends to produce a weapon. On those models never phrase anything negatively; state only what should happen, and control everything else through the keyframes and the other fields.

initial_imagestring

The url OR base64 of the first keyframe. Optional when a middle_image is provided.

middle_imagestring

The url OR base64 of the middle keyframe the animation passes through between the initial and final frames.

final_imagestring

The url OR base64 of the final keyframe. Requires an initial_image or middle_image to anchor the animation.

model'hydra' | 'forge' | 'forge-pixel'

Backing model. Hydra (most capable, generates audio) and the Forge family support a middle keyframe; forge-pixel is the pixel-art variant, for sprites whose frames are pixel art.

loopboolean

Trim the animation at the beginning or end to create a seamless loop. Not guaranteed to produce a perfect loop.

cropboolean

Crop sprite frames to fit content. Results in smaller spritesheets but inconsistent frame sizes across different animations.

frames4 | 9 | 16 | 25 | 36 | 49 | 64

Number of frames in the output spritesheet.

frame_size32 | 64 | 96 | 128 | 192 | 256 | 384 | 0 | -1 | -9

Size of each frame in pixels (width and height). 0 is for maximum resolution. -1 is for AI 1.5x upscaling. -9 is for matching the size and position of the input frame.

margin_rationumber float

Deprecated: prefer margin_ratio_horizontal / margin_ratio_vertical. Amount of padding around the sprite as a ratio (0.0 to 1.0). Sets both axes to this value. A per-axis value, when also given, overrides this for that axis. Supplying any margin value selects margin_ratio_mode "manual" unless margin_ratio_mode is set explicitly.

margin_ratio_horizontalnumber float

Horizontal padding around the sprite as a ratio (0.0 to 1.0). Useful for animations that extend sideways (e.g., sword slashes, punches). Supplying a value selects margin_ratio_mode "manual" unless margin_ratio_mode is set explicitly; overrides the legacy margin_ratio on this axis.

margin_ratio_verticalnumber float

Vertical padding around the sprite as a ratio (0.0 to 1.0). Useful for animations that extend up or down (e.g., jumps). Supplying a value selects margin_ratio_mode "manual" unless margin_ratio_mode is set explicitly; overrides the legacy margin_ratio on this axis.

margin_ratio_mode'auto' | 'manual' | 'none'

Controls how margins are applied around the sprite. Omit it and send margin_ratio_horizontal / margin_ratio_vertical to get "manual" automatically. "manual" requires margin_ratio_horizontal and/or margin_ratio_vertical (or the legacy margin_ratio); sending "manual" with no margin value fails with HTTP 400. Sending "auto" or "none" explicitly together with a margin value fails with HTTP 400 (the value would be ignored).

image_typestring

Type of sprite being animated. Affects generation parameters and styling.

durationnumber float

Animation length in seconds. This endpoint always runs on the Forge model, so only Forge's durations apply - the source of truth is MODEL_PRICING (credits.js), surfaced via /credits/costs.

augment_promptboolean

Augment the prompt behind the scenes. Disable to have more control. Incompatible with automatic framing: false requires margin_ratio_mode "manual" (with margin_ratio_horizontal and/or margin_ratio_vertical) or "none". Because margin_ratio_mode defaults to "auto", sending augment_prompt false on its own fails with HTTP 400.

gifboolean

When true, generates an animated GIF from the spritesheet and returns it in gif_url. Disabled by default to reduce response time.

individual_framesboolean

When true, extracts each frame from the spritesheet as an individual image and returns the URLs in individual_frame_urls.

spritesheet_with_backgroundboolean

When true, also returns the spritesheet with background intact (before background removal). Useful for manually fixing background removal issues. The with-background spritesheet URL will be in spritesheet_with_background_url.

request_idstring

Optional client-provided identifier, unique per request. Re-sending the same request_id returns the existing job instead of generating again. Also usable as the request_id filter of listGenerations.

asyncboolean

Defaults to true: the call returns 202 immediately with a job id to poll with getApiJob. Set false for a synchronous response (deprecated but supported): the call then blocks until the result is ready.

Response

Success

spritesheet_urlstring
video_urlstring
audio_urlstring

URL of the sound effect generated for the animation (mp3). hydra only; absent for forge and forge-pixel.

gif_urlstring
individual_frame_urlsstring[]
num_framesinteger

Number of frames in the spritesheet.

num_colsinteger

Columns in the frame grid. Frames run left-to-right, top-to-bottom.

num_rowsinteger

Rows in the frame grid. The last row may be only partly filled.

spritesheet_with_background_urlstring
individual_frame_with_background_urlsstring[]
durationnumber float
request_idstring
created_atinteger

Changes

Changed in 1 of the 17 revisions of this API.1