Ludo AI Game Assets

ai.ludoPublished by ludo.aiOfficial publisherv0.16.6Updated Nov 5, 2026

Generate game assets with AI: sprites, animations, 3D models with rigging, video, music, SFX, voices

VerifiedStreamable HTTPWeb executableMedia & DesignAI & ML

Overview

AI-generated overview

Ludo AI's remote MCP server for generating game assets: sprites, spritesheet animations, 3D models, directional sprites, video, music, SFX and voices.

What you can do
  • Generate and edit images: sprites, icons, backgrounds, textures, style-matched art, poses, camera rotations, background removal, upscaling and pixel-art conversion
  • Animate sprites into spritesheets from prompts, keyframes, motion transfer or presets, then edit, rotate, re-export or add sound effects
  • Create 3D assets: image-to-GLB models, rigging, text-driven or preset skeletal animation, and directional sprites rendered from up to 8 directions with fitted accessories
  • Produce video from images or references, edit and upscale it, and generate sound effects, ambiance, music, voices and cloned-voice speech
  • Track asynchronous jobs (poll, list, cancel), check credit balance and pricing, search…
When to use it
Useful when building a game or interactive project and you want an assistant to produce and iterate on art, animation, 3D and audio assets from prompts without leaving the chat. Also handy for converting existing images into sprites, pixel art or rigged models.
Requirements
Remote Streamable HTTP endpoint; no local runtime needed (clients that only run local servers need a bridge such as mcp-remote with Node.js). Requires a Ludo API key sent in the Authorization header, and API access comes with the Pro and Studio plans. Credits are consumed per generation.
Before you install
Generation spends credits; check pricing and balance before expensive calls. Returned asset URLs expire after 7 days, so download anything needed for production immediately. Uploaded images, audio and video are sent to Ludo's service. Jobs can be queued and cancelled, and some tools write nothing but still cost credits.

Installation

In SourceWeft

  1. Open Ludo AI Game Assets in the dashboard and add it to a workspace.
  2. Connect Authorization token credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/ai.ludo%2Fgame-assets/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "ludo-ai-game-assets": {
      "type": "http",
      "url": "https://mcp.ludo.ai/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}

README

Ludo AI MCP Server

Generate game assets using AI through the Model Context Protocol (MCP).

Features

CategoryCapabilities
ImagesSprites, icons, screenshots, backgrounds, UI assets, textures, background removal, upscaling, pixel-art conversion
3D ModelsCharacter images ready for a 3D model (from a prompt, or your own image redrawn as a 3D render), convert 2D images to GLB models with PBR textures (prop or the more detailed hero model, rigged in the same call if you like), auto-rig models (skeleton + skin weights, engine-ready joint naming), text-driven skeletal animation, retarget curated animation presets onto rigged models
Directional SpritesRender a 3D model as styled sprites from up to 8 directions that line up, in looks from pixel art to painted to 3D render, animated with a preset or your own clip, holding fitted accessories (swords, shields, helmets...), previewed for free before you render
AnimationAnimated spritesheets from static sprites (4-64 frames), keyframe animation through up to three fixed frames, motion transfer from video or presets, spritesheet editing (re-prompt, outpaint, loop fixing, finer-detail re-render), free re-export with other sheet settings, sound effects for a spritesheet
VideoGenerate short videos from images or reference images (5-15 seconds, with a soundtrack), prompt-driven video editing, 2x upscaling
AudioSound effects, background music, character voices, TTS
Jobs & HistoryAsync job queue: submit, poll or long-poll, list and cancel jobs (queued jobs refund their credits), plus paginated generation history across the API and the web app
AccountCredit balance, plan and auto top-up settings, to check before an expensive generation; plans, prices and what each call costs
DocumentationSearch or read Ludo's own feature guidance before generating: animation modes, model choice, margins, known limitations
FeedbackReport a limitation, bug or missing capability straight to the Ludo team

Quick Start

1. Get an API Key

API access comes with the Pro and Studio plans. Create a key at app.ludo.ai/api-keys; it is shown only once.

Using a coding agent (Claude Code, Codex, Cursor)? The Ludo CLI is the better fit: the agent loads only the commands it needs, and files go in and out by path.

2. Configure Your MCP Client

The server speaks Streamable HTTP at https://mcp.ludo.ai/mcp. Every client sends the key in a header:

Authorization: ApiKey YOUR_API_KEY

Setups for eleven clients, including Windsurf, Cline, Zed and Kiro, are on ludo.ai/developers/mcp.

Claude Code
sh
claude mcp add --transport http ludo https://mcp.ludo.ai/mcp --header "Authorization: ApiKey YOUR_API_KEY"

Add -s user to use it in every project.

Claude Desktop and claude.ai

Open Customize > Connectors, click Add, then Add custom connector. Name it Ludo, use the URL https://mcp.ludo.ai/mcp, and under Request headers add Authorization: ApiKey YOUR_API_KEY. (claude_desktop_config.json only starts local servers; a remote server goes in as a connector.)

Codex

Add to ~/.codex/config.toml:

toml
[mcp_servers.ludo]url = "https://mcp.ludo.ai/mcp"
[mcp_servers.ludo.http_headers]Authorization = "ApiKey YOUR_API_KEY"
Cursor

Add to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):

json
{  "mcpServers": {    "ludo": {      "url": "https://mcp.ludo.ai/mcp",      "headers": {        "Authorization": "ApiKey YOUR_API_KEY"      }    }  }}
VS Code

Add to .vscode/mcp.json, then use Copilot Chat in Agent mode. VS Code asks for the key once and stores it securely:

json
{  "inputs": [    { "type": "promptString", "id": "ludo-api-key", "description": "Ludo.ai API key", "password": true }  ],  "servers": {    "ludo": {      "type": "http",      "url": "https://mcp.ludo.ai/mcp",      "headers": { "Authorization": "ApiKey ${input:ludo-api-key}" }    }  }}
Gemini CLI
sh
gemini mcp add -s user --transport http --header "Authorization: ApiKey YOUR_API_KEY" ludo https://mcp.ludo.ai/mcp
Clients that only run local servers

Bridge with mcp-remote (needs Node.js). Keep the header argument free of spaces and pass the key through env:

json
{  "mcpServers": {    "ludo": {      "command": "npx",      "args": ["-y", "mcp-remote", "https://mcp.ludo.ai/mcp", "--header", "Authorization:${LUDO_AUTH}"],      "env": { "LUDO_AUTH": "ApiKey YOUR_API_KEY" }    }  }}

Available Tools

Generation tools run on a job queue and return a job id immediately; the Returns field of each tool below describes the result you get back from getApiJob once the job succeeds. See How Generation Calls Work.

Models

Sprite animation, motion transfer, spritesheet editing and video generation take an optional model. Pick from the current models; the defaults are what the Ludo web app uses.

ModelUsed forNotes
hydraSprite animation, keyframes, motion transfer and spritesheet editing (the default for all four)Most capable all-around model; its spritesheets come with a generated sound effect (audio_url, an mp3). 3 credits/s, shortest animation 3s (9 credits minimum)
griffin-hd (Griffin)Sprite animation, keyframes and spritesheet editingHighest resolution and best image fidelity. Flat 10 credits per animation; up to 5s
forgeSprite animation, keyframes, motion transfer, spritesheet editingCost-effective, for basic animations and simple sprites; on motion transfer it works best with presets and matching poses. Multiple tries might be needed. 1.5 credits/s on animation, 2 credits/s on transfer and editing, no minimum charge
forge-pixelSame actions as forgeSame pricing as forge; for low-res pixel-art sprites
griffin-hd (Griffin)Video generation, video from references and video editing (the default for all three)Cinematic video in any style with a soundtrack, 720p. 2 credits/s on all three, 5s to 15s. Landscape and portrait output is too large for upscaleVideo

griffin (480p) was retired from video generation and video from references on 2026-10-27. Requests that name it are rejected; use griffin-hd.

Legacy models - hydra-plus (since 2026-11-02), blitz, eagle, eagle-audio, tango (and the alias standard) - are still accepted so existing integrations keep working, but they are scheduled for removal. Do not use them for new work. The server marks them LEGACY in every tool description and lists them last.

Search Documentation (searchDocs)

Ask Ludo's own documentation a plain-language question and get back only the few sections that answer it: how to choose a sprite animation mode, when to use Generate Before / Generate After, how margins behave, which model suits a job, what something costs, and each generator's known limitations. This is the fastest way to learn how a feature is meant to be used before generating with it, so start here rather than reading whole documents.

ParameterRequiredDescription
queryYesWhat you want to know, in plain language (up to 500 characters), e.g. "how do I keep a sprite animation's colors consistent"
nNoMaximum number of sections to return (1-10, default: 3)

Returns:

  • results: Array of { doc, label, section, relevance, content }, best first. content is the section's full markdown; doc and section can be passed straight to getDocs to read it again. relevance is a 0-1 match score, and only results scoring 0.6 or higher are returned
  • message: Present only when results is empty, which means the documentation does not cover the question. Rephrase it, or browse with getDocs

If the search backend is briefly unavailable the tool returns 503; fall back to getDocs rather than retrying in a loop.

Credits: Free


Feature Documentation (getDocs)

Browse or read Ludo's documentation in full. This is the same documentation the Ludo web app shows its users, so it occasionally describes buttons rather than parameters; the substance applies here just the same. To answer a specific question, use searchDocs first.

Call it with no parameters to get a table of contents, then again with doc (and ideally sections) to read only what you need. The whole corpus is roughly 280,000 characters, so fetching a full document without naming sections can return tens of thousands of characters.

ParameterRequiredDescription
docNoDocument to read. Omit for the table of contents. One of assistant, game-ideator, image-generator, project, account, faq, 3d-generator, video-generator, sprite-generator, audio-generator, api-mcp, game-asset-generation
sectionsNoSection titles to return from doc, matched ignoring case, spacing and punctuation. Only valid together with doc

Returns:

  • docs: Array of { id, label, sections }, where each section is { title, content }. content is markdown, and is omitted from the table of contents
  • unmatched_sections / available_sections: Present only when some, but not all, requested titles matched: the titles that matched nothing, and every valid title of doc

An unknown doc, or a request where no section title matches, returns 400 listing the valid values, so a wrong guess costs one extra call rather than a dead end.

The server also announces both documentation tools to MCP clients via its instructions field during the initialize handshake, so models connected through clients that surface server instructions are told to search the documentation before generating.

Credits: Free


Image Generation (createImage)

Generate sprites, icons, backgrounds, UI assets, and textures from a text prompt alone (no source image needed). To match the art style of an existing image use generateWithStyle, to modify an existing image use editImage, and to cut out a subject use removeBackground.

ParameterRequiredDescription
promptYesDetailed description of the image
image_typeYessprite, icon, screenshot, art, asset, sprite-vfx, ui_asset, fixed_background, side_scrolling_background, texture, horizontal_tile, tile, item-icon, portrait, card-art, splash, 3d, generic
art_styleNo8-Bit, 16-Bit, 32-Bit, Hi-Bit, Low Poly, Stylized 3D, Voxel Art, Flat Design, Anime/Manga, Western Cartoon, Hand-Painted, Photorealistic 3D, Cel-Shaded, etc.
perspectiveNoSide-Scroll, Top-Down, Isometric, First-Person, Third-Person, 2.5D
aspect_ratioNodefault, ar_1_1, ar_4_3, ar_16_9, ar_9_16
nNoNumber of variations (1-8, default: 1)
request_idNoClient-provided ID to retrieve results later

Credits: 0.5 per image


Edit Image (editImage)

Modify an existing image using text instructions (smart editing).

ParameterRequiredDescription
imageYesURL or base64-encoded image to edit
promptYesDescription of changes (e.g., "remove the background", "make it darker", "add clouds to the sky")
reference_imageNoURL or base64 reference image for style/content guidance
nNoNumber of variations (1-4, default: 1)
request_idNoClient-provided ID to retrieve results later

Credits: 0.5 per image


Generate with Style (generateWithStyle)

Generate new content while maintaining the visual style of a reference image.

ParameterRequiredDescription
style_imageYesURL or base64-encoded reference image for style matching
promptYesDescription of what to generate (e.g., "a warrior character", "a treasure chest")
image_typeYessprite, icon, screenshot, art, asset, sprite-vfx, ui_asset, fixed_background, texture, 3d, generic
nNoNumber of variations (1-4, default: 1)
request_idNoClient-provided ID to retrieve results later

Credits: 0.5 per image


Generate Pose (generatePose)

Generate a new pose for an existing sprite. Use this BEFORE animateSprite to get the best animation results - the starting pose should match your intended animation.

ParameterRequiredDescription
imageYesURL or base64-encoded sprite image
poseYesTarget pose: Idle (Front), Idle (Back), Idle (Left Facing), Idle (Right Facing), Walk (Left), Walk (Right), Run (Left), Run (Right), Crouching, Crawling, Sitting, Attack Ready, Jump Preparation, Defending / Blocking, Flying, Sleeping, or Other (with a free-text description)
descriptionNoAdditional instructions to guide pose generation
nNoNumber of variations (1-4, default: 1)
request_idNoClient-provided ID to retrieve results later

Returns: url, pose, motion_prompt

Example workflow:

  1. Generate a "Walk (Left)" pose with generatePose
  2. Use the returned motion_prompt directly in animateSprite for optimal animation results

Credits: 0.5 per image


Rotate Sprite (rotateSprite)

Rotate the camera view of an existing sprite to a new angle, keeping the same character and pose. Useful for generating turnaround / directional views of a sprite.

ParameterRequiredDescription
imageYesURL or base64-encoded sprite image
camera_rotationYesCamera azimuth in degrees: 0 (front), 45 (front-right), 90 (right side), 135 (back-right), 180 (back), -135 (back-left), -90 (left side), -45 (front-left)
camera_elevationNoCamera tilt in degrees: 0 (eye-level), 30 (elevated), 60 (high-angle). Omit to keep the sprite's current elevation.
nNoNumber of variations (1-4, default: 1)
request_idNoClient-provided ID to retrieve results later

Returns: url, camera_rotation, camera_elevation

Credits: 0.5 per image


Remove Background (removeBackground)

Remove the background from a single image, returning the subject isolated on a transparent background. For broader edits (not just cutting out the subject), use editImage instead.

ParameterRequiredDescription
imageYesURL or base64-encoded image
cropNoTrim the result to the subject's bounding box (default: false)
creative_editNoHigher-quality output that may not match the input pixel-for-pixel (default: true). Set false when the subject must stay pixel-identical, e.g. an existing sprite you will animate
request_idNoClient-provided ID to retrieve results later

Returns: a single result with url (transparent PNG)

Credits: 0.5 per image


Upscale Image (upscaleImage)

The same image at a higher resolution, up to 4x, with the result capped at 2048px on its longest side. The source must be below 2048px on its longest side; a larger one is rejected with HTTP 400 before anything is charged.

ParameterRequiredDescription
imageYesURL or base64-encoded image, below 2048px on its longest side
request_idNoClient-provided ID to retrieve results later

Returns: a single result with url

Credits: 0.5 per image

Convert to Pixel Art (convertToPixelArt)

Any art, broken AI pixel art or pixel art comes back as pixel art at about the input's own size. Synchronous: the call answers with the result directly, with no job to poll.

ParameterRequiredDescription
imageYesURL or base64-encoded image, up to 15MB
pixel_sizeNoSize of one pixel-art pixel in the input's pixels (at least 2); larger is coarser. Omit to use the image's own pixel grid, which must be detectable (otherwise HTTP 400 asks for a pixel_size). On an input already on a grid it snaps to whole steps of that grid
palette_sizeNoAt most this many colours (2-256); omit to keep the colours
request_idNoClient-provided ID to retrieve results later

Returns: url, pixel_size (yours, or the detected one, which can be fractional), and columns / rows, the art's size in pixel-art pixels: resize to columns x rows with nearest-neighbour for one image pixel per art pixel

Credits: Free (20 calls per 5 minutes, 120 an hour, 1,000 a day)


3D Model Generation (create3DModel)

Convert a 2D image to a 3D GLB model with textures, optionally rigged in the same call.

ParameterRequiredDescription
imageYesURL or base64-encoded image, taken as the front view
modelNoprop (default): low-cost, for everyday props and environment pieces. hero: far more detailed and accurate, for close-up assets, but slower and more expensive
back_imageNoprop only: the same subject seen from behind (URL or base64), so the back of the model follows it instead of being invented. hero rejects it
texture_typeNopbr (default), simple, none
texture_sizeNo1024, 2048 (default)
target_num_facesNoTriangle count 1,000-200,000 (default: 50,000)
rigNoAlso rig the model (skeleton + skin weights) in the same call (default: false). It gets the general rig, which suits any shape; there is no rig type to pick here (rigModel offers the others). Animation presets and Directional Sprites' preset_id retarget onto it, though not onto every model
joint_namingNoWith rig: the bone naming convention, as in rigModel (default: smpl)
request_idNoClient-provided ID to retrieve results later

Returns: model_url (GLB file), snapshot images from different angles, and rigged

Credits: 4 per model with prop, 15 with hero; rig adds 1, charged only when the model comes back rigged Processing time: 60-120 seconds with prop; hero is slower


Image for a 3D Model (create3DModelImage)

A character image ready for create3DModel, the first step of Directional Sprites on the web. create3DModel converts the image it is given as it is; this makes one for it first. Pass a prompt, your own image, or both: an image is redrawn as a 3D render, and the prompt then says what to change. A redraw is a new picture each time, so call again for another try.

ParameterRequiredDescription
promptOne of the twoWithout an image: a description of the character (e.g. "a knight in green armour, full body, standing"). With an image: the changes to make (e.g. "add a red cape and a sword"), optional. Up to 1,000 characters
imageOne of the twoURL or base64-encoded image of your own, redrawn as a 3D render
request_idNoClient-provided ID to retrieve results later

Returns: a single result with url, to pass as create3DModel's image

Credits: 0.5 per image


Rig 3D Model (rigModel)

Generate a skeleton and skin weights for an existing 3D model so it can be animated. Non-destructive to the geometry: it returns a new rigged GLB. Rig a model before using animate3DModel.

ParameterRequiredDescription
modelYesURL or base64-encoded GLB to rig
rig_typeNoSkeleton style prior: general (default, works for any asset), humanoid (anime-style characters, densest skeleton), game (classic game-character rig), or the pinned humanoid templates with named joints: humanoid_template (22 joints) and humanoid_template_hands (52 joints, five fingers per hand). The templates only suit two-armed, two-legged characters. Animation presets (animate3DModelPreset) retarget onto any rig type, though not onto every model
joint_namingNoBone naming convention for the identified joints: smpl (default), mixamo (Unity's humanoid auto-mapper), humanik (unprefixed names for Maya/MotionBuilder/FBX), unreal (UE mannequin), godot (SkeletonProfileHumanoid), rigify (Blender) or vroid (VRM). Purely a relabel, the skeleton is identical
request_idNoOptional client-provided identifier for this request

Returns: model_url (rigged GLB, skeleton + skin weights baked in), rigged (true)

Credits: 1 per rig Processing time: 60-120 seconds


Animate 3D Model (animate3DModel)

Generate text-driven skeletal animations for an already-rigged 3D model (rig it first with rigModel). Animation quality is hit-or-miss, so several candidates are returned for you to choose from. Each candidate is a standalone animation-only GLB (skeleton + one clip, no mesh) plus an mp4 preview; pick the best one and fuse it onto your model in a game engine or three.js.

ParameterRequiredDescription
modelYesURL or base64-encoded rigged GLB to animate (rig it first with rigModel)
promptYesDesired motion (e.g., "walking", "swinging an axe", "waving hello")
modeNoAnimation representation: rot_trans (default, per-bone rotation + translation, most faithful) or rot_only (rotation + root translation only, for retargeting to other skeletons / engine pipelines that ignore bone translation)
num_variantsNoNumber of candidate animations to generate (1-8, default: 4)
loopNoReturn to the initial pose: each clip plays forward then mirrors back to the rest pose for a seamless loop (default: true). Best for one-way motions (crouch, punch, wave); reads oddly for cyclic gaits like walking
augment_promptNoRewrite the prompt into a detailed motion caption behind the scenes (default: true)
request_idNoOptional client-provided identifier for this request

Returns: animations, an array of candidates, each with clip_name, glb_url (animation-only GLB), preview_url (mp4), mode, seed, motion, fit_rmse

Credits: 0.5 per generation (one charge returns all variants; promotional price) Processing time: 60-120 seconds


Animate 3D Model from Preset (animate3DModelPreset)

Apply a curated animation preset to an already-rigged 3D model (retargeting). Unlike animate3DModel, the motion comes from a professionally curated clip library instead of a text prompt, so exactly one clip is returned. Any rig type can take a preset (rig the model first with rigModel, or create3DModel with rig: true), though retargeting does not succeed on every model; when it does not, the job returns an error. Any preset id from listAnimationPresets works.

ParameterRequiredDescription
modelYesURL or base64-encoded rigged GLB (any rig type)
preset_idYesid of a preset from listAnimationPresets
crop_loopNoTrim the animation to the span that loops seamlessly. Omit for Auto: cyclic motions (walk, idle) loop, one-shots (jump, cast) keep their full arc
in_placeNoRemove the animation's net travel so the character moves on the spot, the treadmill clip a game engine expects, with the engine driving locomotion. Omit to follow crop_loop
request_idNoOptional client-provided identifier for this request

Returns: animations, the same envelope as animate3DModel, containing one clip with clip_name, preset_id, glb_url (animation-only GLB, joints named as on your model), preview_url (mp4), seed, motion, fit_rmse

Credits: 0.5 per retarget Processing time: 30-90 seconds


Directional Sprites

Render a 3D model as styled sprites seen from up to 8 directions (where the camera stands around a character facing S). Every direction asked for in one call is rendered together, on the same frame size, scale and floor, so the sprites line up. The usual flow:

  1. (Optional) A character image: create3DModelImage from a prompt, or your own image redrawn as a 3D render.
  2. A rigged model: create3DModel with that image and rig: true (or rigModel for a model you already have). Any rig type can take an animation preset, though retargeting does not succeed on every model.
  3. (Optional) An animation, at most one: a preset_id from listAnimationPresets, or an animation_url made for this model by animate3DModelPreset or animate3DModel. With none, the sprites are a still pose.
  4. (Optional) Accessories: fitDirectionalAccessory for each item (a sword, a shield, a helmet...), adjusted until it looks right, then attachDirectionalAccessories for one model holding them all. Use its model_url as model from here on.
  5. listDirectionalSpriteStyles: pick a look.
  6. previewDirectionalSprites: check it, free.
  7. createDirectionalSprites for animated spritesheets, or createDirectionalStills for still images.
fitDirectionalAccessory

Fit one item GLB to a rigged model, held by one bone: a hand, the head, the back or the hips. The item is first placed automatically for its kind (a sword by its handle, a gun by its pistol grip, a shield on the forearm, a helmet over the head, a backpack on the back), and the hand closes round it. Adjust it relative to that automatic fit and call again until it looks right: each call starts from the automatic fit, so send the full adjustment every time. Nothing is saved. Free and synchronous (not a job): a few seconds with previews, about a second without.

ParameterRequiredDescription
modelYesThe rigged model (create3DModel with rig: true, or rigModel), URL or base64 GLB, up to 30MB
itemYesThe item, any 3D model (create3DModel without rig), URL or base64 GLB, up to 30MB
nameNoWhat the item is, in words ("rusty sword"); used to guess kind when it is omitted
kindNoblade, gun, staff, bow, shield, helmet, hat, back, ...: decides how it is first held
point / boneNoWhere it goes: an attach point (the response lists the ones this skeleton has), or a bone by name. Default: where its kind goes
sizeNo% of the automatic fit's size (100 = as fitted)
moveNo{forward, up, out} in % of the character's height, e.g. {"up": 3}
turnNo{forward, up, out} in degrees
flipNoHold it by its other end
gripNoClose the hand round it (skeletons with finger bones)
previewNofalse returns only the fit and its checks
preview_preset_idNoThe animation preset the previews show

Returns: the fit as applied (kind, point, bone, size, move, turn, flip, grip), the placement to pass to attachDirectionalAccessories, checks (how far the item sinks into the body, how far its grip is from the palm, how much of the head pokes through a helmet), points (this skeleton's attach points) and, unless preview is false, model_url (the model holding the item, kept 7 days) and previews (4 walking frames each from SW and SE). Previews share previewDirectionalSprites' one-at-a-time slot; when they could not be made, preview_error says why and the fit is still valid.

Credits: Free (30 calls per 5 minutes, 200 an hour, 1,000 a day)

attachDirectionalAccessories

Put up to 8 items on the model, each at the placement fitDirectionalAccessory returned (or, without one, at the automatic fit plus the same kind / point / bone / size / move / turn / flip / grip adjustments). At most one item closes each hand: the first one listed. Free and synchronous.

ParameterRequiredDescription
modelYesThe rigged model, URL or base64 GLB, up to 30MB. The URL of one of your 3D models also saves the items on it
itemsYesEvery item the model holds: item (URL or base64 GLB, as sent to the fit), name, and placement or the adjustments above
save_on_modelNofalse only builds the GLB, without saving the items on your model

Returns: model_url (one GLB of the model holding every item, kept 7 days: pass it as model to previewDirectionalSprites, createDirectionalSprites or createDirectionalStills), saved (whether the items were saved on your model, which replaces its previous items and shows them in the Ludo web app's Directional Sprites) and items

Credits: Free (20 calls per 5 minutes, 300 a day)

listDirectionalSpriteStyles

Free. Returns styles (each with id, label, description, family, pixel, thumbnail_url, version and its settings / advanced_settings: a name, kind of choice, bool or color, options and default), plus the perspectives and directions to choose from.

previewDirectionalSprites

A few frames of the model in a style, from each direction asked for, to check a look before rendering. Synchronous (not a job) and free; nothing is saved to your generations. Returns previews, one per direction: frame_urls (transparent images: 4 frames when animated, 1 for a still model), width, height, num_frames, fps and render_3d (the style and settings as rendered). An account runs one preview at a time: starting another cancels the one still running, which then answers with no body (HTTP 204). Takes the model, animation, camera and style parameters below, and target_frame_size (32-384, default 256).

createDirectionalSprites
ParameterRequiredDescription
modelYesURL or base64-encoded GLB (rigged, to animate it)
animation_urlNoAn animation made for this model: the glb_url from animate3DModel or animate3DModelPreset (URL or base64)
preset_idNoA preset from listAnimationPresets, retargeted onto the model (any rig type can take one, though retargeting does not succeed on every model, and when it does not the call returns an error)
crop_loopNoWith preset_id: trim the preset to the span that loops seamlessly
model_animationNoThe name of an animation the GLB itself carries
perspectiveNohorizon, low, isometric (default), high, top
directionsNoUp to 8 of S, SW, W, NW, N, NE, E, SE (default: ["SW"])
style_idNoA style from listDirectionalSpriteStyles (default: render_3d)
style_paramsNoThe style's settings to change, by name
style_versionNoPin a style version, e.g. the one a previous render_3d reports
target_frame_sizeNoSprite size in pixels, 32-640 (default: 640)
num_framesNoFrames per sheet, 4-100 (default: 36)
loopNoSample the animation as a seamless loop; omit to follow the animation
keep_horizontal_travel / keep_vertical_travelNoKeep the animation's ground travel (default: off) / its vertical motion (default: on)
gif / individual_framesNoAlso return each sheet as a GIF / its frames as separate images
request_idNoClient-provided ID to retrieve results later

At most one of animation_url, preset_id and model_animation; with none, each sheet is a single frame.

Returns: sheets, one per direction in the order asked, each with direction, spritesheet_url, video_url, num_frames, num_cols, num_rows, fps, render_3d, and gif_url / individual_frame_urls when asked

Credits: 1 per direction

createDirectionalStills

The model as it is, one large transparent sprite image per direction, ready for animateSprite or editImage. Takes model, perspective, directions, style_id, style_params, style_version and request_id as above.

Returns: images, one per direction, each with direction, url, width, height and render_3d

Credits: 0.5 per direction


Sprite Animation (animateSprite)

Create animated spritesheets from static images. Use this when you can describe the motion in text; use transferMotion to copy an exact motion from a reference video or a named preset, and generatePose first when the source image is not yet in the pose the animation should start from.

ParameterRequiredDescription
initial_imageYesURL or base64 of the starting frame
motion_promptYesAnimation description (e.g., "walking", "idle breathing", "attack slash", "casting a fireball with both hands"). See Writing the motion prompt
image_typeNosprite (default), sprite-vfx, ui_asset
framesNo4, 9, 16, 25, 36 (default), 49, 64
frame_sizeNo0 (default, max resolution), 32, 64, 96, 128, 192, 256, 384, -1 (AI 1.5× upscale), -9 (match input frame)
loopNoSeamless loop (default: true)
cropNoCrop frames to fit content (default: true); smaller spritesheets but inconsistent frame sizes across animations
margin_ratio_horizontalNoHorizontal padding around the sprite as a ratio 0.0–1.0 (only used when margin_ratio_mode is manual). Useful for animations that extend sideways, e.g. sword slashes or punches
margin_ratio_verticalNoVertical padding around the sprite as a ratio 0.0–1.0 (only used when margin_ratio_mode is manual). Useful for animations that extend up or down, e.g. jumps
margin_ratioNoDeprecated - uniform padding on both axes, equivalent to setting both per-axis params to the same value. Cannot be combined with the per-axis params (fails with 400)
margin_ratio_modeNoauto (default), manual, none
augment_promptNoAugment the motion prompt behind the scenes (default: true)
modelNohydra (default; best motion and prompt adherence, generates audio), griffin-hd (Griffin: highest resolution and best image fidelity), forge (cheapest, for simple body shapes and simple actions), forge-pixel (low-res pixel art). Legacy, avoid for new work: hydra-plus, blitz, eagle, eagle-audio (alias standard→blitz)
durationNoDefault 3s. Hydra / Hydra+: 3–5s in 0.5 steps; Griffin: 5s only; Forge / Forge Pixel: 1–5s in 0.5 steps. A model that does not offer the requested default falls back to its shortest
final_imageNoEnding frame for interpolation
gifNoGenerate an animated GIF (default: false)
individual_framesNoExtract individual frame images (default: false)
spritesheet_with_backgroundNoAlso return the spritesheet with background intact, before background removal (default: false)
request_idNoClient-provided ID to retrieve results later

Returns: spritesheet_url (the sheet), video_url (an mp4 of the animation - pass it to transferMotion as video or to createSpriteAudio as spritesheet_video_url), audio_url (hydra and hydra-plus only: URL of a generated sound effect (mp3), so there is no need to call createSpriteAudio), num_frames, num_cols, num_rows, duration (seconds, to play the sheet at its real speed), and when requested gif_url, individual_frame_urls, spritesheet_with_background_url, individual_frame_with_background_urls

Credits: rate × seconds - Hydra: 3/sec (shortest 3s, so 9 minimum; the default 3s = 9); Forge and Forge Pixel: 1.5/sec, no minimum (3s = 4.5). Griffin: flat 10 per animation. Legacy: Hydra+ 4/sec (shortest 3s, so 12 minimum); Blitz 1.9/sec, Eagle 2.6/sec, Eagle with Audio 3.1/sec, all with a 4-credit minimum. Processing time: 30-90 seconds

Writing the motion prompt

Applies to animateSprite and animateSpriteKeyframes.

  • Describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them.
  • Don't over-describe: too much detail can harm the animation. Name an action the model already knows instead of breaking it into steps ("walking", never "move the left foot forward, then the right foot").
  • Don't restate what the image or keyframes already show (the character, its equipment, the art style, background, lighting, camera). Leave frame count and timing to frames and duration.
  • Negative phrasing ("no background", "do not move the camera", "without a weapon") works only on hydra and hydra-plus. On forge, forge-pixel and the legacy models it backfires: naming something you don't want makes it more likely to appear. On those models state only what should happen.

Keyframe Animation (animateSpriteKeyframes)

Animate a sprite through up to three fixed keyframes (initial_image, middle_image, final_image), producing a spritesheet that interpolates through the provided frames in order. Runs on hydra (default), griffin-hd, forge or forge-pixel (and the legacy hydra-plus) - the models that support a middle keyframe. The motion prompt is optional here: when omitted, the motion is derived purely from the keyframes. For just a start and end frame, animateSprite with final_image does the same job.

ParameterRequiredDescription
initial_imageNo*URL or base64 of the first keyframe. *At least one of initial_image or middle_image is required (a final_image alone is rejected)
middle_imageNo*URL or base64 of the middle keyframe the animation passes through
final_imageNoURL or base64 of the final keyframe
motion_promptNoOptional animation description (e.g., "attack slash"); without it the keyframes drive the motion. See Writing the motion prompt
image_typeNosprite (default), sprite-vfx, ui_asset
modelNohydra (default; generates audio), griffin-hd (Griffin: highest resolution and best image fidelity), forge, or forge-pixel for pixel-art sprites. Legacy: hydra-plus
framesNo4, 9, 16, 25, 36 (default), 49, 64
frame_sizeNo0 (default, max resolution), 32, 64, 96, 128, 192, 256, 384, -1 (AI 1.5× upscale), -9 (match input frame)
loopNoSeamless loop (default: true)
cropNoCrop frames to fit content (default: true); smaller spritesheets but inconsistent frame sizes
margin_ratio_horizontalNoHorizontal padding around the sprite as a ratio 0.0–1.0 (only used when margin_ratio_mode is manual)
margin_ratio_verticalNoVertical padding around the sprite as a ratio 0.0–1.0 (only used when margin_ratio_mode is manual)
margin_ratioNoDeprecated - uniform padding on both axes; cannot be combined with the per-axis params (fails with 400)
margin_ratio_modeNoauto (default), manual, none
augment_promptNoAugment the motion prompt behind the scenes (default: true)
durationNoDefault 3s. Hydra / Hydra+: 3–5s; Griffin: 5s only; Forge / Forge Pixel: 1–5s in 0.5 steps. Three keyframes need the room: at 1s the opening transition is compressed away
gifNoGenerate an animated GIF (default: false)
individual_framesNoExtract individual frame images (default: false)
spritesheet_with_backgroundNoAlso return the spritesheet with background intact, before background removal (default: false)
request_idNoClient-provided ID to retrieve results later

Returns: same shape as animateSprite (spritesheet_url, video_url, audio_url on hydra and hydra-plus, gif_url, num_frames, num_cols, num_rows, duration, ...)

Credits: same as animateSprite - Hydra 3/sec (3s = 9); Griffin flat 10; Forge / Forge Pixel 1.5/sec, no minimum (1s = 1.5, 3s = 4.5, 4s = 6); legacy Hydra+ 4/sec (3s = 12) Processing time: 30-90 seconds


Animation Presets (listAnimationPresets)

List available animation presets, used by transferMotion (onto a sprite) and animate3DModelPreset (onto a rigged 3D model). Returns preset animations, perspectives, and directions; no video URLs are exposed.

Returns:

  • animations: Array of presets with id, name, category, description, duration and preview_url; any of them can be retargeted onto a rigged 3D model (animate3DModelPreset) or used as a Directional Sprites preset_id
  • perspectives: Array with id, name, description (all animations support all perspectives)
  • directions: ["N", "NE", "E", "SE", "S", "SW", "W", "NW"] (all animations support all directions)

Credits: Free


Motion Transfer (transferMotion)

Transfer motion from a video or animation preset onto a static sprite, producing an animated spritesheet. Use it when you want an exact motion copied - a standard walk or attack cycle from listAnimationPresets, or your own clip; use animateSprite to describe the motion in text instead.

ParameterRequiredDescription
imageYesURL or base64-encoded sprite image
videoNoURL of the video to use as motion source: the video_url of a spritesheet from animateSprite, or your own clip. Videos up to 4 seconds work best. Either video or preset_id + perspective + direction must be provided; when both are sent the video is used
preset_idNoID of an animation preset to use instead of a video URL, from listAnimationPresets. When using a preset, perspective and direction are required
directionNoFacing direction for the preset, as a compass point: N, NE, E, SE, S, SW, W, NW. Required with a preset
perspectiveNoCamera perspective of the preset clip, the same set for every preset: high (tactical, steep top-down), horizon (side view at eye level), isometric (diagonal top-down with depth), low (hero, low angle), top (directly overhead). Required with a preset
framesNo4, 9, 16, 25, 36 (default), 49, 64
frame_sizeNo0 (default, max resolution), 32, 64, 96, 128, 192, 256, 384
loopNoTrim animation for a seamless loop (default: true)
cropNoCrop frames to fit content (default: true)
margin_ratio_horizontalNoHorizontal padding around the sprite (0.0–1.0). Useful for animations that extend sideways, e.g. sword slashes or punches
margin_ratio_verticalNoVertical padding around the sprite (0.0–1.0). Useful for animations that extend up or down, e.g. jumps
margin_ratioNoDeprecated - uniform padding on both axes (0.0–1.0, default 0.15 when no margin is given). Cannot be combined with the per-axis params (fails with 400)
margin_ratio_modeNomanual (default), none
gifNoGenerate an animated GIF (default: false)
individual_framesNoExtract individual frame images (default: false)
spritesheet_with_backgroundNoAlso return the spritesheet with background intact, before background removal (default: false)
modelNohydra (default; most capable, generates audio), forge (cheaper; for simple motion, works best with presets and matching poses), forge-pixel (pixel art). Legacy, avoid for new work: tango
durationNoAnimation length in seconds. Omitted, it is 1.5 where the model offers it and otherwise the model's shortest, so 3s on hydra (the default). Hydra: 3–5s in 0.5 steps; Forge / Forge Pixel: 1–5s. A longer reference clip or preset is compressed to fit, so pass the preset's own duration to keep its timing
request_idNoClient-provided ID to retrieve results later

Returns: same shape as animateSprite (spritesheet_url, video_url, audio_url on hydra, gif_url, individual_frame_urls, spritesheet_with_background_url, individual_frame_with_background_urls, num_frames, num_cols, num_rows, duration)

Credits: rate × seconds - Hydra (default): 3/sec (the default 3s = 9); Forge / Forge Pixel: 2/sec, no minimum (1.5s = 3, 3s = 6). Legacy Tango: 4/sec with a 4-credit minimum. The produced length follows the reference clip, and you are never charged for more than you requested


Edit Spritesheet (editSpritesheet)

Edit a spritesheet you previously generated: re-prompt its animation, outpaint beyond the frame (zoom out), repair a bad loop, or re-render a hydra sheet with finer detail (improve). Pass back the spritesheet_url you received from animateSprite, animateSpriteKeyframes, transferMotion, or an earlier edit; it must be a spritesheet you generated in the last 7 days (external URLs are not accepted). Omit duration, frames, frame_size, crop and model to keep the source spritesheet's values.

ParameterRequiredDescription
spritesheet_urlYesURL of a spritesheet you generated in the last 7 days
edit_modeNoprompt (default), re-prompt the animation; outpaint, extend beyond the frame; fix_loop, repair a bad loop; improve, re-render with finer detail (the extra pass hydra-plus runs when it generates). improve takes only a spritesheet generated with hydra: any other source returns 400, including an already improved sheet or a loop fix or outpaint of one
promptNoEdit instruction. Required for prompt mode, optional for outpaint, not accepted for fix_loop or improve
imagesNoUp to 5 reference images (URL or base64) to guide the edit
durationNoOutput length in seconds (per model, as on animateSprite). Omit to keep the source spritesheet's duration. It does not change the price of fix_loop, outpaint or improve, which bill the source spritesheet's video length
modelNohydra (default), griffin-hd (Griffin, up to 5s), forge, forge-pixel. Omit to keep the source spritesheet's model. Only used by prompt mode; outpaint, fix_loop and improve run a fixed pipeline and ignore it
cropNoCrop frames to fit content. Omit to keep the source's setting
loopNoTrim animation for seamless loop (default: true)
framesNoFrames in the output spritesheet: 4, 9, 16, 25, 36, 49, 64. Defaults to the source's frame count
frame_sizeNoFrame size in pixels: 32–384, or 0 for max resolution. Defaults to the source's frame size
gifNoGenerate an animated GIF (default: false)
individual_framesNoExtract individual frame images (default: false)
spritesheet_with_backgroundNoAlso return the spritesheet with background intact (default: false)
request_idNoClient-provided ID to retrieve results later

Returns: same shape as animateSprite (spritesheet_url, video_url, gif_url, num_frames, num_cols, num_rows, ...). New audio is generated only by prompt edits on hydra; fix_loop, outpaint and improve keep the source spritesheet's audio_url when it had one

Credits: fix_loop, outpaint and improve: flat 1 credit per second of output, held for and capped at the source spritesheet's video length, no minimum, model ignored (a 3s sheet = 3, whatever duration you pass). prompt edits: per model - Hydra 3/sec (3s = 9), Griffin flat 10, Forge / Forge Pixel 2/sec, no minimum (3s = 6)

Adjust Spritesheet (adjustSpritesheet)

Re-export a spritesheet you generated through the API in the last 7 days with different sheet settings, without generating the animation again: the same video re-cut into a new sheet. Use it to fix framing (an effect clipped by True Size: a fixed frame_size or 0), change the frame count or size for your engine, upscale 1.5x (frame_size -1), turn loop trimming on or off, or pack it as ordinary art when its detected pixel grid is wrong (use_pixel_grid: false). It cannot change the motion, margins or content: use editSpritesheet for that. Omit a setting to keep the source's value.

ParameterRequiredDescription
spritesheet_urlYesA spritesheet_url from animateSprite, animateSpriteKeyframes, transferMotion, editSpritesheet, rotateSpritesheet or an earlier adjust. External URLs are not accepted
framesNoFrames in the new sheet
frame_sizeNoSprite size in pixels; 0 max resolution, -1 AI 1.5x upscaling, -9 True Size
loopNoTrim for a seamless loop
cropNoCrop frames to their content (ignored with True Size)
use_pixel_gridNofalse packs as ordinary art when the detected pixel grid is wrong for the asset
gif / individual_frames / spritesheet_with_backgroundNoExtra outputs, as on animateSprite
request_idNoClient-provided ID to retrieve results later

Returns: same shape as animateSprite, with the source's audio_url when it had one. The source is left as it is

Credits: Free (20 calls per 5 minutes, 120 an hour, 1,000 a day)


Spritesheet Sound Effect (createSpriteAudio)

Generate a sound effect for a spritesheet animation you previously generated. Spritesheets made with hydra already come with audio_url, so call this for forge / forge-pixel output, or to replace hydra's sound.

ParameterRequiredDescription
spritesheet_video_urlYesThe video_url you received from animateSprite, animateSpriteKeyframes, transferMotion or editSpritesheet; it must belong to a spritesheet you generated in the last 7 days
promptNoWhat the sound should be, e.g. "metallic sword swing with a whoosh"
request_idNoClient-provided ID to find the job again; must not be one you already used for another generation

Returns: url of the generated audio file. The audio is also attached to the spritesheet, so it shows up as audio_url on that item in listGenerations

Credits: 3 per call


Video Generation (createVideo)

Generate short videos from a source image and a motion prompt (image-to-video). A source image is required: to make a video from text alone, first createImage and animate that, or use createVideoFromReferences. The current model generates a soundtrack, so no separate audio step is needed.

ParameterRequiredDescription
imageYesURL or base64 starting frame
promptYesMotion description (e.g., "camera zooms in", "character walks forward")
durationNoDefault 5s. Griffin HD: 5–15s in 1s steps
modelNogriffin-hd (default; 720p, with soundtrack). Legacy, avoid for new work: blitz, eagle, eagle-audio (alias standard→blitz)
final_imageNoEnding frame for interpolation
request_idNoClient-provided ID to retrieve results later

Returns: url, duration, has_audio

Credits: rate × seconds - Griffin HD: 2/sec (the default 5s = 10). Legacy: Blitz 1/sec, Eagle 1.3/sec, Eagle with Audio 1.8/sec.


Video from References (createVideoFromReferences)

Generate a video from 1-5 reference images and a text prompt. Unlike createVideo, which animates a single source image, this composes a new scene that borrows characters, objects, and style from the references.

ParameterRequiredDescription
promptYesText description of the video to generate
imagesYes1 to 5 reference images (URL or base64)
durationNoVideo length in seconds: 5–15 (default 5)
modelNogriffin-hd (default; 720p, with soundtrack). Legacy, avoid for new work: eagle, eagle-audio
aspect_ratioNodefault (model chooses), ar_1_1, ar_16_9, ar_9_16, ar_4_3, ar_3_4, ar_21_9
request_idNoClient-provided ID to retrieve results later

Returns: url, duration, has_audio

Credits: rate × seconds, the same rate as createVideo - Griffin HD: 2/sec (the default 5s = 10). Legacy: Eagle 1.5/sec, Eagle with Audio 2/sec.


Edit Video (editVideo)

Edit a video you previously generated with a text prompt and optional reference images (video-to-video). Pass back the url you received from createVideo, createVideoFromReferences, or an earlier edit; it must be a video you generated in the last 7 days (external URLs are not accepted).

ParameterRequiredDescription
videoYesURL of a video you generated in the last 7 days
promptYesEdit instruction describing the desired change
imagesNoUp to 5 reference images (URL or base64) to guide the edit
durationNoOutput length in seconds: 5–15. Omit to keep the source video's duration
modelNogriffin-hd (default; 720p, with soundtrack). Legacy, avoid for new work: eagle
request_idNoClient-provided ID to retrieve results later

Returns: url, duration, has_audio

Credits: Griffin HD: 2 credits/sec (5s = 10)


Upscale Video (upscaleVideo)

Upscale a video you previously generated to twice its resolution (2x). Pass back the url you received from createVideo, createVideoFromReferences, or editVideo; it must be a video you generated in the last 7 days (external URLs are not accepted). Both dimensions of the source must be under 960 pixels: griffin-hd (720p) landscape and portrait output is larger than that, so a current-model video qualifies only when it is square. A too-large source fails the job and the held credits are refunded.

ParameterRequiredDescription
videoYesURL of a video you generated in the last 7 days, both dimensions under 960 pixels
request_idNoClient-provided ID to retrieve results later

Returns: url (2x width and height, same duration), duration, has_audio

Credits: Flat rate by duration, independent of model: 0.2 credits/sec (5s = 1)


Sound Effect Generation (createSoundEffect)

Generate game sound effects from text descriptions.

ParameterRequiredDescription
descriptionYesSound description (e.g., "laser gun firing", "footsteps on gravel", "coin pickup")
durationNo0-10 seconds (0 = automatic)
request_idNoClient-provided ID to retrieve results later

Credits: 2 per sound


Ambiance Generation (createAmbiance)

Generate ambient soundscapes and background atmospheres from text descriptions.

ParameterRequiredDescription
descriptionYesAmbiance description (e.g., "windy forest at dusk", "busy medieval market", "spaceship engine hum")
durationNoDuration in seconds (0 = automatic, based on the description)
loopNoGenerate a seamlessly looping ambience (default: true)
augment_promptNoAugment the prompt behind the scenes (default: true)
request_idNoClient-provided ID to retrieve results later

Credits: 2 per generation


Music Generation (createMusic)

Generate background music and themes.

ParameterRequiredDescription
descriptionYesMusic description (e.g., "epic orchestral battle theme", "calm piano melody", "8-bit chiptune")
lyricsNoOptional lyrics for vocal tracks
request_idNoClient-provided ID to retrieve results later

Credits: 3 per track


Audio Transform (createAudioTransform)

Remix or transform an existing audio sample using a text prompt.

ParameterRequiredDescription
sampleYesURL or base64-encoded source audio sample to remix (15MB max)
promptYesDescription guiding the remix (e.g., "make it sound like an 80s synthwave track")
durationNoDuration in seconds: 0 (automatic, matches the source) or 10–180 in steps of 10
modification_strengthNoHow strongly the source is modified, 0–1 (default: 0.6; 0 = close to original)
augment_promptNoAugment the prompt behind the scenes (default: true)
request_idNoClient-provided ID to retrieve results later

Credits: 3 per generation


Voice Generation (createVoice)

Generate unique character voices.

ParameterRequiredDescription
voice_descriptionYesCharacter description (e.g., "gruff old warrior", "cheerful young girl")
textYesText to speak (max 200 characters)
typeNohuman (default) or non-human
request_idNoClient-provided ID to retrieve results later

Credits: 1 per voice


Text-to-Speech (createSpeech)

Clone a voice from an audio sample.

ParameterRequiredDescription
textYesText to speak (max 1000 characters)
sampleYesURL or base64 audio sample for voice cloning
request_idNoClient-provided ID to retrieve results later

Credits: 1 per generation


Text-to-Speech Preset (createSpeechPreset)

Use preset voices for text-to-speech.

ParameterRequiredDescription
textYesText to speak (max 1000 characters)
voice_preset_idYesSerious woman, Wise woman, Calm woman, Patient man, Determined man, Deep voice man, Teen boy, Sweet girl, etc.
emotionNoDefault, Happy, Sad, Angry, Fearful, Surprised, Neutral
languageNoauto, English, Spanish, French, German, Japanese, Korean, etc.
request_idNoClient-provided ID to retrieve results later

Credits: 1 per generation


Check a Job (getApiJob)

Poll the status of a generation job started by any tool. Every job returns {id, status}; call getApiJob with that id until status is succeeded (then read result, shaped exactly like the tool's documented output) or failed (then read error).

ParameterRequiredDescription
idYesJob id returned by the generation tool
waitNoSeconds to long-poll for a terminal state (0-60, default: 0). With wait the call is held open and returns the moment the job finishes

Returns: id, status (queued, running, succeeded, failed, canceled), result on success, error ({code, subcode, message, retriable}) on failure, plus poll_after_ms on non-terminal responses (wait at least that long before polling again). Generations typically finish within a few minutes; a job still queued after 15 minutes can be cancelled and resubmitted

Credits: Free


List Jobs (listApiJobs)

List the generation jobs you started through the API or MCP, most recent first. Web app jobs are not included.

ParameterRequiredDescription
statusNoComma-separated statuses to include (queued, running, succeeded, failed, canceled). Defaults to all
limitNoMaximum number of jobs to return (default: 50, capped at 100)

Returns: Array of job objects with id, status, and timestamps

Credits: Free


Cancel a Job (cancelApiJob)

Cancel a job that is still queued and get its credits refunded. Jobs that are already running cannot be canceled (the call fails with 409).

ParameterRequiredDescription
idYesJob id to cancel

Returns: The canceled job

Credits: Free, and the queued job's credits are refunded


Generation History (listGenerations)

List your generation history across both the API and the Ludo web studio, with filtering, text search and pagination. This replaces the per-type results tools (getImageResults, getSpriteResults, getVideoResults, getAudioResults, get3DModelResults), which have been removed from the MCP and deprecated in the REST API.

ParameterRequiredDescription
typeYesimage, spritesheet, video, audio, 3d
sourceNoapi (your API/MCP generations, last 7 days only), web (your web studio generations, no time limit), or all (default)
searchNoFree-text search. Every whitespace-separated term must match the item's tags or one of its text fields (prompt, hints, style, label, ...), so "dwarf axe" narrows to items matching both
request_idNoOnly return items tagged with this request_id when you generated them
date_fromNoOnly items generated at or after this time (unix seconds)
date_toNoOnly items generated at or before this time (unix seconds)
page_sizeNoItems per page, 1-100 (default: 20)
page_numberNo1-based page number (default: 1)

Returns: items, page, page_size, has_more. Keep paging while has_more is true

Credits: Free


Account (getAccount)

Show your credit balance, plan and auto top-up settings. Check it before an expensive generation instead of waiting for a 402. No parameters.

Returns:

  • credits:
    • available: what generations can spend right now (plan_credits + extra - used).
    • resets_at: when the plan credits refill (unix seconds).
    • team_pool: true when the balance is your team's shared pool.
    • paused: true while the subscription is paused.
    • grace_until: set when the subscription has ended; remaining credits stay spendable until then.
  • plan: name and api_access.
  • auto_topup: enabled, threshold and credits. It is null for team members, because the team owner manages it.
  • billing_url: where to buy credits or change the plan or auto top-up. Those changes happen in the web app, not through the API.

Credits: Free

Pricing (getPricing)

What Ludo's paid service costs and includes, for an agent advising a user: every plan with its monthly and annual price, credits, seats and queue concurrency; credit top-ups and their price brackets; what each API call costs; and the rules to know before telling a user to pay (the API, MCP and CLI need an active Pro or Studio plan, and there every generation costs credits). Plans are bought in the web app (links.billing), not through the API. Works with or without an API key. No parameters.

Returns: currency, summary, plans (cheapest first), top_ups, rules, costs, links

Credits: Free

Send Feedback (submitApiFeedback)

Report a problem with the Ludo API itself to the Ludo team. Use it only for API bugs (an error, a failed or stuck job, a crash, a response that does not match the documentation) and API limitations (a parameter, operation or format you needed that the API does not support, and that you could not work around). Never use it to report model limitations or the quality of a result: an image, sprite, animation, 3D model, video or sound that looks wrong, ignores part of the prompt, has artifacts or is not what you wanted is not an API bug. Retry with a different prompt, model or settings instead. Describe what you were trying to do and what went wrong. Send one report per issue, leave out personal data, secrets and file contents, and if you are an agent, tell the user what you sent.

ParameterRequiredDescription
categoryYesbug, limitation, feature_request, praise or other. Generated content that looks wrong is a model limitation, not a bug: do not report it
messageYesWhat you were trying to do, what happened, and what would have helped (up to 4,000 characters)
operationNoThe tool the feedback is about, e.g. animateSprite
job_idNoThe job it is about, when there is one
agentNoThe agent or app sending it, e.g. Claude Code

Returns: ok and the report's id

Credits: Free


How Generation Calls Work

Every generation runs on a job queue, and over MCP every generation tool is asynchronous. A generation call returns {id, status: "queued"} right away instead of blocking, so nothing is held open while a GPU runs and no MCP transport can time out mid-generation. You then collect the result with getApiJob. There is no async parameter on the MCP tools: it is not a knob you need to set.

(The REST API works the same way if you call it directly rather than through MCP: requests default to async and return 202 with a job id. Synchronous responses are deprecated there, but passing async: false in the payload still opts into them and stays supported indefinitely.)

Collecting a result

# Submit the work, get a job id straight backanimateSprite with initial_image="url", motion_prompt="walking"-> { "id": "job_abc123", "status": "queued" }
# Long-poll until it finishes (up to 60s per call), then read resultgetApiJob with id="job_abc123", wait=30-> { "id": "job_abc123", "status": "succeeded", "result": { "spritesheet_url": "...", ... } }

result is exactly the response the tool documents; on failure read error instead. Without wait, poll every few seconds and respect the poll_after_ms hint on non-terminal responses. Use listApiJobs to see what is still in flight and cancelApiJob to drop a job that has not started yet (its credits are refunded).

How credits are charged

Credits are held when a job is accepted. For duration-priced tools (sprites and video) the final charge is max(rate × produced seconds, the model's minimum charge), never more than for the duration you requested; the difference is refunded when the job completes. If the job fails or you cancel it while queued, everything is refunded. Each tool's Credits line above gives the rate and minimum; the server also states the contract once in its instructions field.

Fair Use Limits

  • 50 generations queued or running per account. Submitting beyond that returns 429 with code PENDING_JOBS_LIMIT; wait for jobs to finish, then submit again.
  • 150 requests per 5 minutes on the read endpoints (job status, job listing, generation history, account, feature documentation), per API key. A 429 carries Retry-After.
  • 60 requests per 5 minutes, and 1,000 per day, on documentation search (searchDocs), per API key.
  • The free synchronous tools have their own limits, given with each one above: convertToPixelArt, adjustSpritesheet, fitDirectionalAccessory and attachDirectionalAccessories.

Finding Results Later

Every generation tool also accepts an optional request_id. It tags the result so you can find it again afterwards, for example from a different session:

# Tag a generationanimateSprite with request_id="my-anim-001", initial_image="url", motion_prompt="walking"
# Later, look it up againlistGenerations with type="spritesheet", request_id="my-anim-001"

listGenerations is the general history tool: filter by type, by source (api, web or all), by free-text search, or by date, and page through the results. API-generated results are available for 7 days.


Asset URL Expiration

All generated asset URLs (images, spritesheets, videos, audio, 3D models) point to Google Cloud Storage links that expire after 7 days. Any asset that needs to outlive that window, especially assets destined for production use, must be downloaded and saved locally (or re-uploaded to permanent storage) right away. Never store the returned URLs as permanent references.

The server also announces this to MCP clients via its instructions field during the initialize handshake, so models connected through clients that surface server instructions will be reminded automatically.


Example Prompts

Creating Game Assets

Create a pixel art knight character with sword and shield, side view, 16-bit style
Generate an isometric treasure chest icon for a mobile RPG
Create a low-poly stylized tree for a casual mobile game

Animations

Animate this character with a smooth walking cycle, 16 frames
Create an idle breathing animation for this character sprite
Rig this 3D character using Mixamo joint names, then apply a walk animation preset to it
Animate this fire sprite as a looping VFX effect

Audio

Create a satisfying coin pickup sound effect for a platformer
Generate an epic orchestral boss battle theme, intense and dramatic
Create a voice for a wise old wizard saying "The journey begins now"

API Documentation

Full API documentation with all parameters and response formats: api.ludo.ai/api-documentation

Support

License

Proprietary - See ludo.ai/terms for terms of service.

Source: README.md at commit c413288

Tools

48

validateApiKeyEndpoint

Validate API key

Validates an API key. Returns 200 if valid, 403 if invalid.

Takes no parameters.

createImage

Create image

Generate game-art images from a text prompt alone, selecting an image_type (e.g. sprite) and optionally art_style, perspective, and aspect_ratio. The job result is an array of image results, each with a url; request n (1-8) to control how many variations come back. Because it generates purely from text it takes no source image, so there is no upload size limit to trip. Credits are held when the job is accepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use createImage to make new images from scratch; use generateWithStyle to match a reference image's art style, editImage to modify an existing image, and removeBackground to cut out a subject. Pass an optional request_id to tag the results so you can retrieve them later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per result.

ParametersrequestBodyrequired

generateWithStyle

Create image in a reference style

Generate new images that match the visual style of a reference image: supply a style_image (URL or base64) plus a text prompt describing what to create and an optional image_type (defaults to sprite). The job result is an array of image results, each with a url; request n (1-4) to control the number of variations. The style_image is uploaded and validated, and an image larger than 15MB is rejected with HTTP 400. Credits are held when the job is accepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use this instead of createImage when style consistency with an existing asset matters; use editImage to alter the content of a specific image rather than borrow its style, and removeBackground to isolate a subject. Pass an optional request_id to tag the results so you can retrieve them later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per result.

ParametersrequestBodyrequired

editImage

Edit image

Modify an existing image according to text instructions: supply a source image (URL or base64) and a prompt describing the changes (e.g. "add clouds", "warmer color scheme"), with an optional reference_image for extra style or content guidance. To change only one area, pass a mask (white = change, black = keep, the same size as the image): mask_mode "replace" (default) redraws that area from the prompt, "erase" removes what is there. Without a mask the whole image is re-rendered. Never ask for a transparent background in the prompt: it often comes back as a grey-and-white checkerboard painted into the pixels, which removeBackground cannot remove. A sprite keeps its transparency without being asked (see image_type). The job result is an array of image results, each with a url; request n (1-4) to control the number of edited variations. Provided images are uploaded and validated, and any image larger than 15MB is rejected with HTTP 400. Credits are held when the job is accepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use editImage to transform a specific existing image; use createImage to generate from text alone, generateWithStyle to borrow a reference's art style, and removeBackground for the dedicated background-removal case. Pass an optional request_id to tag the results so you can retrieve them later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per result; 1 credit per result with a mask.

ParametersrequestBodyrequired

animateSprite

Animate sprite

Animate a static sprite into a spritesheet driven by a motion text prompt (image-to-spritesheet): supply an initial_image (URL or base64) plus a motion_prompt like "walking" or "attack slash", and optionally a final_image to interpolate between a start and end frame. Describe the motion exactly and unambiguously, but do not over-describe it: an action the model already knows is one phrase, not a sequence of steps, and the character, art style, background and camera come from the image, not the prompt. For animations driven by up to three keyframes (including a middle frame), use animateSpriteKeyframes instead. The job result is a single sprite result: `spritesheet_url` (the sheet image), `video_url` (an mp4 of the animation - pass it as `video` to transferMotion or as `spritesheet_video_url` to createSpriteAudio; editSpritesheet takes `spritesheet_url`), `num_frames`/`num_cols`/`num_rows` (the grid layout), and, when requested, `gif_url`, `individual_frame_urls` and `spritesheet_with_background_url`. The hydra and hydra-plus models also return `audio_url`, a sound effect for the animation - there is no need to call createSpriteAudio afterwards; forge and forge-pixel produce no audio. The chosen model must support sprite animation and the duration must be valid for it; incompatible model/duration combinations return HTTP 400. Credits are held for the duration you requested when the job is accepted; the final charge is rate × seconds of video generated (legacy models keep their minimum charge), never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. The returned sheet is then trimmed to its best loop and can run slightly shorter than the video; that trim is not deducted. Choosing a tool: animateSprite (this one) when you can describe the motion in text; transferMotion when you want an exact motion copied from a reference video or one of the named presets from listAnimationPresets (e.g. a standar

ParametersrequestBodyrequired

animateSpriteKeyframes

Animate sprite from keyframes

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. initial_image is required: the animation starts from it, and middle_image and final_image add keyframes after it (either 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`), hydra-plus (hydra with finer detail, 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 and hydra-plus). Credits are held for the duration you requested when the job is accepted; the final charge is rate × seconds of video generated, never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. The returned sheet is then trimmed to its best loop and can run slightly shorter than the video; that trim is not deducted. 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). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: credits/s × seconds, per model: Hydra 3/s (shortest duration 3s, so 9 credits minimum), Griffin 10 flat, Forge 1.5/s, Forge Pixel 1.5/s, Hydra+ 4/s (shortest duration 3s, so 12 credits minimum) [LEGACY]; flat = credits per generation; [LEGACY] models are scheduled for removal - do not use them for new work; see this endpoint's full pricing table in the API

ParametersrequestBodyrequired

generatePose

Re-pose sprite

Re-pose an existing sprite into a new target pose while preserving the character, taking a source image (URL or base64), a pose name (or "Other" with a free-text description), and an optional n (1-4) for how many variations to produce. Only works with sprite image types (not icons, screenshots, etc.). The job result is an array of pose results, each containing the generated image url, the pose and description used, and a suggested motion_prompt tuned for that pose. Credits are held when the job is accepted and refunded if it fails or is cancelled; the charge scales with the number of images generated. This is typically the first step before animating: call generatePose to set the character's pose, then feed the result (and its suggested motion_prompt) into animateSprite for the best animation quality; use rotateSprite instead when you want to change the camera angle rather than the pose. Pass an optional request_id to tag the results so you can locate them later via listGenerations (type spritesheet). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per result.

ParametersrequestBodyrequired

rotateSprite

Rotate sprite to a new view

Re-render an existing sprite from a different camera viewpoint while keeping the same character and pose, taking a source image (URL or base64), a required camera_rotation azimuth (one of 0, 45, 90, 135, 180, -135, -90, -45 degrees), an optional camera_elevation (0, 30, or 60 degrees; omit to keep the current elevation), and an optional n (1-4) for the number of variations. Only works with sprite image types (not icons, screenshots, etc.). The job result is an array of rotate-sprite results, each with the generated image url and the camera_rotation and camera_elevation that were applied. Credits are held when the job is accepted and refunded if it fails or is cancelled; the charge scales with the number of images generated. Use this to produce alternate view angles of a character; use generatePose instead to change the character's pose rather than the camera, and animateSprite or transferMotion to bring a sprite to life. Pass an optional request_id to tag the results so you can retrieve them later via listGenerations (type spritesheet). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per result.

ParametersrequestBodyrequired

transferMotion

Transfer motion onto sprite

Transfer motion from a reference video or a named animation preset onto a static sprite image, producing an animated spritesheet that mimics the reference movement. Provide the sprite as image (URL or base64) plus either a video URL or a preset_id together with perspective and direction (all three from listAnimationPresets; if both video and preset_id are sent the video wins). The job result is the same sprite result as animateSprite: `spritesheet_url`, `video_url`, grid fields, optional GIF / frame / with-background URLs, and `audio_url` when the model is hydra. `duration` defaults to 1.5s where the chosen model offers it, otherwise to that model's shortest (hydra, the default, starts at 3s) - and a longer reference clip or preset is compressed to fit, so pass the preset's own `duration` (returned by listAnimationPresets) to keep its timing. It returns HTTP 400 if neither a video nor a complete preset_id/perspective/direction triple is supplied, if the named preset, perspective, or direction cannot be resolved, or if the model/duration combination is invalid. Credits are held for the duration you requested when the job is accepted; the final charge is rate × seconds of video generated (which follows the reference clip or preset; legacy models keep their minimum charge), never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. The returned sheet is then trimmed to its best loop and can run slightly shorter than the video; that trim is not deducted. Use this when you have an existing motion clip or preset to copy; prefer animateSprite to generate animation purely from a text prompt. Omit `model` to run on hydra (the default - most capable, and returns audio); pick forge for a cheaper run on simple motion, presets and matching poses; the `model` field lists rates. Pass an optional request_id to tag the result so you can retrieve it later via listGenerations (type spritesheet). Async generation jo

ParametersrequestBodyrequired

getDocs

Browse Ludo docs

Browse or read Ludo's own documentation in full - how to choose a sprite animation mode, when to use Generate Before / Generate After, how margins behave, which model suits a job, and each generator's known limitations. To answer a specific question, call searchDocs first: it returns just the sections that match. Use getDocs to see what documentation exists, or to read a whole document or named sections. This is the same documentation the Ludo web app shows its users, so it occasionally describes buttons rather than parameters; the substance applies to the API and MCP surfaces just the same. To browse, call it with NO parameters to get a table of contents - every document with its id, label and section titles, and no bodies - then call it again with `doc` (and optionally `sections`) to read only what you need. Fetching a whole document can return tens of thousands of characters, so prefer naming the sections, using titles copied from the table of contents. Section titles match ignoring case, spacing and punctuation: when only some requested titles exist you receive those sections plus `unmatched_sections` and `available_sections`, and when none exist (or `doc` is unknown) the call returns 400 listing the valid values so you can retry once. This is a free discovery endpoint: it does not charge credits and does not queue a job.

Parametersdocsections

searchDocs

Search Ludo docs

Search Ludo's own documentation with a plain-language question and get back only the few sections that answer it - the fastest way to learn how a feature is meant to be used before you generate with it (how to pick a sprite animation mode or model, how margins behave, what something costs, known limitations). Start here rather than reading whole documents. Each result carries `doc` and `section`, which you can pass straight to getDocs to re-read that section, and the section's full markdown `content`. Results are best first; weak matches are left out, so an empty `results` list means the documentation does not cover the question - rephrase it, or call getDocs with no parameters to browse the table of contents. This is the same documentation the Ludo web app shows its users, so it occasionally describes buttons rather than parameters; the substance applies to the API and MCP surfaces just the same. Returns up to `n` sections (default 3, max 10). If it answers 503 the search backend is briefly unavailable: call getDocs instead rather than retrying in a loop. This is a free discovery endpoint: it does not charge credits and does not queue a job.

Parametersnqueryrequired

listAnimationPresets

List animation presets

List the available animation presets along with their perspectives and the eight supported compass directions (N, NE, E, SE, S, SW, W, NW). Synchronous GET with no request body: it returns an animations array (each with id, name, category, description, duration, and preview_url), a deduplicated perspectives array, and the directions list. This is a free discovery endpoint and does not charge credits. Use it to obtain the preset_id, perspective, and direction values that transferMotion needs, and to find motion preset names you can reference when animating; pair it with transferMotion (to apply a preset onto a sprite), animateSprite (text-prompt animation), or animate3DModelPreset (apply any preset by id to a rigged 3D model).

Takes no parameters.

editSpritesheet

Edit spritesheet

Edit a previously generated spritesheet: re-prompt its underlying animation (edit_mode "prompt"), extend the frame beyond its borders ("outpaint"), repair a bad loop ("fix_loop"), or re-render it with finer detail ("improve": the extra pass hydra-plus runs when it generates, on a spritesheet generated with hydra only - any other returns HTTP 400; a sheet generated on hydra-plus already has it). Pass the `spritesheet_url` you received from `animateSprite`, `animateSpriteKeyframes`, `transferMotion`, or an earlier edit - it must be a spritesheet you generated within the last 7 days; arbitrary external images are not accepted. Omit `duration`, `frames`, `frame_size`, `crop` and `model` to keep the source spritesheet's values. A `prompt` is required for edit_mode "prompt", optional for "outpaint", and not accepted for "fix_loop" or "improve"; optionally add up to 5 reference `images` (URL or base64) to guide the edit. The job result is the same result shape as animateSprite (spritesheet URL, frame layout, optional GIF or individual frames). Credits are held when the job is accepted; the final charge is rate × seconds of video generated, never more than was held, and the difference (or everything, if the job fails or is cancelled) is refunded. The returned sheet is then trimmed to its best loop and can run slightly shorter than the video; that trim is not deducted. Prompt edits are priced per model (credits/second × duration) and held for the duration you requested; "outpaint", "fix_loop" and "improve" run a lighter pipeline in which `model` is ignored and are billed at a flat 1 credit per second of output, held for and capped at the length of the source spritesheet's video (`duration` does not change their price). Outpaint decides the extra margin itself - there is no amount parameter. The result carries the same fields as animateSprite (`spritesheet_url`, `video_url`, grid fields); new audio is generated only by prompt edits on hydra: "fix_loop", "outpaint" and "improv

ParametersrequestBodyrequired

rotateSpritesheet

Rotate spritesheet to a new view

Re-render a previously generated sprite animation from a new view: the same motion and timing, seen from a different angle (e.g. a front-facing walk cycle turned into the same walk seen from the back). Pass the `spritesheet_url` you received from `animateSprite`, `animateSpriteKeyframes`, `transferMotion`, `editSpritesheet` or an earlier call - it must be a spritesheet you generated within the last 7 days; arbitrary external images are not accepted - and, as `image` (URL or base64), the character exactly as it must appear in the new view: it becomes the first frame of the animation. To produce that image, call rotateSprite on the animation's first frame (or any image of the character) and pick the view you want. An optional `final_image` fixes the last frame (it defaults to the first frame, for cyclic or returning animations), and an optional `prompt` steers the result: the character's facing in the new view ("its back to the camera"), where the action goes ("the kick goes to the left of the frame"), or anything else about the motion. Runs on hydra (default) or hydra-plus (finer detail). The job result is the same sprite result as animateSprite (`spritesheet_url`, `video_url`, grid fields, optional GIF and frame URLs). The animation covers the source's own length (up to 5 seconds; a longer source is sped up to fit), so omit `duration` unless you need to change that. Credits are held for that length when the job is accepted, or for 3 seconds when it is shorter (a new view is a new generation, and hydra generates at least 3 seconds); the final charge is the model's rate × seconds of video generated, never more than was held, and the difference (or everything, if the job fails or is cancelled) is refunded. Pass an optional request_id to tag the result for later retrieval via listGenerations (type spritesheet). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: Cost varies by model and durati

ParametersrequestBodyrequired

adjustSpritesheet

Adjust spritesheet export

Adjust Sprite Sheet: re-export a previously generated sprite animation with different sheet settings - frame count, frame size, loop trimming or whitespace cropping - without generating the animation again. Free (no credits). Pass the `spritesheet_url` you received from `animateSprite`, `animateSpriteKeyframes`, `transferMotion`, `editSpritesheet`, `rotateSpritesheet` or an earlier adjust - it must be a spritesheet you generated through the API within the last 7 days; arbitrary external images are not accepted. Omit a setting to keep the source's value. The animation itself is unchanged: this only re-cuts the same video into a new sheet, so use it to fix framing (for example an effect clipped by True Size: re-export with a fixed `frame_size` or 0), to change the frame count or size for your engine, to upscale it 1.5x (`frame_size` -1), to turn loop trimming on or off, or to pack it as ordinary art when its detected pixel grid is wrong for the asset (`use_pixel_grid` false). It cannot change the motion, margins or content - use editSpritesheet for that. The source is left as it is and the result is a new spritesheet with its own `spritesheet_url`. The job result is the same sprite result as animateSprite (`spritesheet_url`, `video_url`, grid fields, optional GIF and frame URLs, and the source's `audio_url` when it has one). Limited to 20 calls per 5 minutes, 120 an hour and 1000 a day. Pass an optional request_id to tag the result for later retrieval via listGenerations (type spritesheet). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).

ParametersrequestBodyrequired

createSpriteAudio

Create sound for a spritesheet

Generate a sound effect for a previously generated spritesheet animation. Pass, as `spritesheet_video_url`, the `video_url` you received from `animateSprite`, `animateSpriteKeyframes`, `transferMotion`, or `editSpritesheet` - it must belong to a spritesheet you generated within the last 7 days; arbitrary external videos are not accepted. Spritesheets generated with the hydra model already come with `audio_url`, so only call this for forge / forge-pixel output or to replace hydra's sound. Optionally add a `prompt` describing the sound you want. The job result is only the URL of the generated audio file, an MP3 or WAV (the URL's extension, .mp3 or .wav, says which); no video is returned. The audio is also attached to the spritesheet, so it appears as `audio_url` in listGenerations (type spritesheet), where the spritesheet keeps the `request_id` it was generated with. Pass an optional `request_id` to make this call idempotent and to find its job again; it must not be one you already used for another generation. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 3 credits per call.

ParametersrequestBodyrequired

listDirectionalSpriteStyles

List directional sprite styles

List the styles Directional Sprites can render a 3D model in, with the perspectives (camera heights) and the eight directions they render from. Each style has an id (pass it as style_id), a label, a description, a family, whether it is pixel art, a thumbnail_url of the style at its defaults, its current version, and its settings: each setting has a name (the key in style_params), a kind (choice, bool or color - a color setting also takes any colour), its options ({label, value}) and its default. advanced_settings work the same way. Free discovery endpoint: it does not charge credits. Use it before previewDirectionalSprites, createDirectionalSprites and createDirectionalStills.

Takes no parameters.

previewDirectionalSprites

Preview directional sprites

Preview Directional Sprites: a few frames of a 3D model in a style, from each direction asked for, to check a style before rendering. Takes the same model, animation, camera and style fields as createDirectionalSprites. The response (synchronous, not a job) has one preview per direction, in the order asked, each with `frame_urls` - the frames as images (4 for an animated model, 1 for a still one) - and `render_3d`, the style and settings as rendered, which createDirectionalSprites takes back as they are. Free (no credits), and nothing is saved to your generations; the frame images are kept for 7 days. A preview takes several seconds. You run one preview at a time: starting another while one is still running cancels the older one, which then answers 204 with no body. Preview one or two directions while trying styles and render only once the look is right.

ParametersrequestBodyrequired

createDirectionalSprites

Create directional sprites

Directional Sprites: render a 3D model into one spritesheet per direction, in a style. Pass the GLB in `model` (URL or base64; rigged, to animate it - see create3DModel with rig, or rigModel) and at most one animation: `animation_url` (the `glb_url` of an animation from animate3DModel or animate3DModelPreset, made for this model), `preset_id` (a preset from listAnimationPresets, retargeted onto the model; any rig type can take one, though retargeting does not succeed on every model, and when it does not the call returns an error) or `model_animation` (the name of an animation the GLB itself carries). With no animation each sheet is a single frame. `directions` are where the camera stands around a character facing S (up to 8); every direction is rendered together, on the same frame size, scale and floor, so the sheets line up. Pick the style with listDirectionalSpriteStyles (style_id, and style_params for its settings) and check it with previewDirectionalSprites first. The job result is one sheet per direction, in the order asked, each with its `spritesheet_url`, grid fields, fps and `render_3d`. Credits are held for every direction when the job is accepted and charged for the sheets that come back; a failed or cancelled job is refunded. Pass an optional request_id to tag the sheets for later retrieval via listGenerations (type spritesheet). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 1 credit per direction (one sheet each).

ParametersrequestBodyrequired

createDirectionalStills

Create directional stills

Directional Sprites stills: render a 3D model as it is (no animation) into one large image per direction, in a style, on a transparent background. Pass the GLB in `model` (URL or base64), the `directions` (up to 8, rendered together so they line up) and the style (listDirectionalSpriteStyles). Each still is a sprite image you can animate with animateSprite or edit with editImage. The job result is one image per direction, in the order asked. Credits are held for every direction when the job is accepted and charged for the images that come back; a failed or cancelled job is refunded. Pass an optional request_id to tag the images for later retrieval via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per direction (one image each).

ParametersrequestBodyrequired

fitDirectionalAccessory

Fit an accessory to a 3D model

Fit an accessory to a rigged 3D model for Directional Sprites: an item GLB (a sword, a gun, a staff, a bow, a shield, a helmet, a hat, a backpack...) held by one bone of the model - a hand, the head, the back or the hips. Nothing is saved. The item is first placed automatically for its `kind` (a sword by its handle, a gun by its pistol grip, a shield on the forearm, a helmet over the head, a backpack on the back), and the hand closes round it. Adjust it relative to that automatic fit with `size` (% of it), `move` (% of the character's height along forward/up/out) and `turn` (degrees about those axes), and call again with the new values until it looks right: each call starts from the automatic fit, so send the full adjustment every time. The response has the `placement` to pass to attachDirectionalAccessories, `checks` (how far the item sinks into the body, how far its grip is from the palm, how much of the head pokes through a helmet, each in % of the character's height or of its vertices), and, unless `preview` is false, `model_url` (the model holding the item, a GLB kept 7 days) and `previews`: frames of the model walking with it, seen from SW and SE, like previewDirectionalSprites' (which this shares: one preview at a time, a newer one cancels the older, which then comes back without previews). Free (no credits) and synchronous; a fit takes a few seconds with previews.

ParametersrequestBodyrequired

attachDirectionalAccessories

Attach accessories to a 3D model

Put accessories on a rigged 3D model for Directional Sprites: up to 8 items, each at the `placement` fitDirectionalAccessory returned (or, without one, at the automatic fit plus the same size/move/turn adjustments). Returns `model_url`, one GLB of the model holding them all (kept 7 days): pass it as `model` to createDirectionalSprites, createDirectionalStills or previewDirectionalSprites. When `model` is the URL of one of your 3D models (as listGenerations or create3DModel returned it), the items are also saved on that model (`saved: true`; `save_on_model: false` skips it), so the Ludo web app's Directional Sprites shows them on it. Items the model already had saved stay on it and in the GLB (`kept`), except those held by a bone a new item takes; `keep_saved: false` replaces them all. Free (no credits) and synchronous.

ParametersrequestBodyrequired

createVideo

Create video

Generate a short video clip from a source image and a motion text prompt (image-to-video); a source `image` is required - to make a video from text alone, first createImage and animate that, or use createVideoFromReferences with reference images. Griffin (default, 768p) generates a soundtrack; no separate audio step is needed. The older 480p model (`griffin`) has been retired from this endpoint. The job result is the video URL and its actual duration in seconds. Optionally pass `final_image` to interpolate between a start and end frame. The chosen `model` and `duration` must be compatible (incompatible combinations return HTTP 400); see the `model` and `duration` fields for the values each model accepts. Credits are held when the job is accepted; the final charge is rate × produced seconds, never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. Pass an optional `request_id` to tag the result so you can locate it later via listGenerations (type video). Related tools: use `createImage` for static images, `animateSprite` for sprite-sheet animation, and listGenerations (type video) to list videos you generated earlier. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: credits/s × seconds, per model: Griffin 2/s (shortest duration 5s, so 10 credits minimum), Blitz 1/s (shortest duration 2s, so 2 credits minimum) [LEGACY], Eagle 1.3/s [LEGACY], Eagle with Audio 1.8/s [LEGACY]; [LEGACY] models are scheduled for removal - do not use them for new work; see this endpoint's full pricing table in the API docs.

ParametersrequestBodyrequired

createVideoFromReferences

Create video from reference images

Generate a video from 1-5 reference images and a text prompt (references-to-video). Unlike createVideo, which animates a single source image, this composes a new scene that borrows characters, objects, and style from the reference images. Each image can be a URL or base64. Griffin (default, 768p) generates a soundtrack, at the same per-second rate as createVideo. The older 480p model (`griffin`) has been retired from this endpoint. The job result is the video URL and its actual duration in seconds. Choose the output shape with `aspect_ratio` ("default" lets the model decide). The chosen `model` and `duration` must be compatible (incompatible combinations return HTTP 400). Credits are held when the job is accepted; the final charge is rate × produced seconds, never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. Pass an optional `request_id` to tag the result so you can locate it later via listGenerations (type video). Related tools: `createVideo` for image-to-video, `editVideo` to modify a generated video. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: credits/s × seconds, per model: Griffin 2/s (shortest duration 5s, so 10 credits minimum), Eagle 1.5/s [LEGACY], Eagle with Audio 2/s [LEGACY]; [LEGACY] models are scheduled for removal - do not use them for new work; see this endpoint's full pricing table in the API docs.

ParametersrequestBodyrequired

editVideo

Edit video

Edit a previously generated video with a text prompt and optional reference images (video-to-video); runs on griffin-hd (768p, with soundtrack) and the output keeps the source video's duration unless you pass one. Pass the video `url` you received from `createVideo`, `createVideoFromReferences`, or an earlier edit - it must be a video you generated within the last 7 days; arbitrary external videos are not accepted. Optionally add up to 5 reference `images` (URL or base64) to guide the edit. The job result is the new video URL and its actual duration in seconds. Credits are held when the job is accepted; the final charge is rate × produced seconds, never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. Pass an optional `request_id` to tag the result so you can locate it later via listGenerations (type video). Related tools: `createVideo` to generate the source clip, `createVideoFromReferences` for reference-driven generation. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: credits/s × seconds, per model: Griffin 2/s, Eagle 2/s [LEGACY]; [LEGACY] models are scheduled for removal - do not use them for new work; see this endpoint's full pricing table in the API docs.

ParametersrequestBodyrequired

upscaleVideo

Upscale video

Upscale a previously generated video to twice its resolution (2x). Pass the video `url` you received from `createVideo`, `createVideoFromReferences`, or `editVideo` - it must be a video you generated within the last 7 days; arbitrary external videos are not accepted. Both dimensions of the source must be under 960 pixels: griffin-hd (768p) output qualifies only when square (768x768), not landscape (1344x768) or portrait (768x1344); output from the retired griffin (480p) does. A too-large source fails the job and the held credits are refunded. The job result is the new video URL (2x width and height, same duration) and its duration in seconds. Billed per second of video, independent of model; held when the job is accepted and refunded if it fails or is cancelled. Pass an optional `request_id` to tag the result so you can locate it later via listGenerations (type video). Related tools: `createVideo` for image-to-video, `editVideo` to modify a generated video. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: 0.2 credits per second of video.

ParametersrequestBodyrequired

removeBackground

Remove background

Remove the background from a single image, returning the subject isolated on a transparent background. Supply the source image (URL or base64); optionally set crop to trim the result to the content, and creative_edit (default true) for higher-quality output that may not match the input pixel-for-pixel - set it false when the subject must stay pixel-identical, e.g. an existing sprite you will animate. The job result is a single image result with a url (not an array). The image is uploaded and validated, and an image larger than 15MB is rejected with HTTP 400. Credits are held when the job is accepted and refunded if it fails or is cancelled. Use removeBackground for this dedicated cutout task; editImage can also remove backgrounds via a prompt but is better for broader edits, while createImage and generateWithStyle produce new images rather than process an existing one. Pass an optional request_id to tag the result so you can retrieve it later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per result.

ParametersrequestBodyrequired

upscaleImage

Upscale image

Upscale an image: the same picture at a higher resolution, up to 4x, with the result capped at 2048px on its longest side. The source image (URL or base64) must be below 2048px on its longest side; a larger one is rejected with HTTP 400. The job result is a single image result with a url (not an array). The image is uploaded and validated, and an image larger than 15MB is rejected with HTTP 400. Credits are held when the job is accepted and refunded if it fails or is cancelled. Use upscaleImage to raise the resolution of an image you already have; createImage and editImage make new or changed images instead. Pass an optional request_id to tag the result so you can retrieve it later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per result.

ParametersrequestBodyrequired

convertToPixelArt

Convert image to pixel art

Convert an image to pixel art: any art, broken AI pixel art or pixel art comes back as pixel art at about the input's own size. Free (no credits) and synchronous: the call answers with the result directly, with no job to poll. `pixel_size` is the size of one pixel-art pixel, in the input's pixels: larger values give coarser art. Omit it to use the image's own pixel size, which only works on an image that already has a pixel grid - when none can be detected the call fails with HTTP 400 asking for a pixel_size. On an input already on a pixel grid, a pixel_size you pass snaps to whole steps of that grid. `palette_size` (2-256) caps the number of colours; omit it to keep the colours as they are. The response has the image `url`, the `pixel_size` used (fractional when it was detected) and the art's size in pixel-art pixels as `columns` and `rows`; resize the image to columns x rows with nearest-neighbour to get one image pixel per art pixel. The source image (URL or base64) is uploaded and validated, and one larger than 15MB is rejected with HTTP 400. The source is left as it is and the result is a new image. Limited to 20 calls per 5 minutes, 120 an hour and 1000 a day. Pass an optional request_id to tag the result for later retrieval via listGenerations (type image).

ParametersrequestBodyrequired

create3DModel

Create 3D model

Convert a source image into a textured 3D model (image-to-3D). The job result is a downloadable GLB model_url plus an array of snapshot image URLs rendered from different angles (handy for previews). model picks the generator: prop (default) is low-cost and suits everyday props and environment pieces; hero is far more detailed and accurate, for close-up assets, but slower and more expensive. image is the front view; with prop, pass an optional back_image (the same subject seen from behind) so the back of the model follows it instead of being invented - hero takes the front image only and rejects a back_image with HTTP 400. The image is converted as it is: to make a character image for it first, from a prompt or by redrawing your own image as a 3D render, use create3DModelImage. Accepts optional mesh controls: target_num_faces (max triangle count, 1000-200000, default 50000), texture_size (1024 or 2048, default 2048), and texture_type ("pbr", "simple", or "none", default "pbr"). Pass rig true to also rig the model in the same call, with the general rig (joint_naming as in rigModel), ready for animate3DModelPreset or createDirectionalSprites; that adds the rigModel price, charged only when the result comes back rigged. Credits are held when the job is accepted and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type 3d). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 4 credits per call with model "prop" (default), 15 credits per call with model "hero"; rig true adds 1 credit when the model comes back rigged.

ParametersrequestBodyrequired

create3DModelImage

Create image for a 3D model

Make a character image ready to turn into a 3D model, the first step of Directional Sprites on the web. Pass a prompt describing the character, your own image (URL or base64), or both. With an image, it is redrawn as a 3D render, and the prompt becomes the changes to make (e.g. "add a red cape and a sword"); leave the prompt out to keep the character as it is. A redraw is a new picture each time, so call again for another try. The job result is a single image result with a url (not an array): pass that url as create3DModel's image. create3DModel itself converts the image it is given as it is. A call with neither prompt nor image is rejected with HTTP 400, and an image larger than 15MB too. Credits are held when the job is accepted and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can retrieve it later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per result.

ParametersrequestBodyrequired

rigModel

Rig 3D model

Rig a 3D model: generate a skeleton and skin weights for an existing GLB so it can be animated. Accepts a URL or base64-encoded GLB in `model` (here `model` is the 3D asset file, not an AI model name - rigging has no model choice). The job result is a downloadable `model_url` for the rigged GLB. rig_type selects the skeleton prior - general (default, any asset), humanoid (anime-style characters), game (classic game-character rigs), or the pinned humanoid templates for two-armed, two-legged characters: humanoid_template (standard 22-joint skeleton with named joints) and humanoid_template_hands (52 joints, five fingers per hand). Animation presets retarget onto any rig type, though not onto every model. joint_naming relabels the identified joints to a convention - smpl (default), mixamo, humanik, unreal, godot, rigify, or vroid - without changing the skeleton. Credits are held when the job is accepted and refunded if it fails or is cancelled. Rigging is non-destructive to geometry but replaces any prior skeleton, so animations made against an old rig no longer apply. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 1 credits per call.

ParametersrequestBodyrequired

animate3DModel

Animate 3D model

Generate text-driven skeletal animations for an already-rigged 3D model. Pass the rigged GLB in `model` (URL or base64; the 3D asset file, not an AI model name) and a motion `prompt` (e.g. "walking", "swinging its axe"). The model must already have a skeleton - rig it first with rigModel if not. The job result is num_variants candidate animations (default 4), each a standalone animation-only GLB (skeleton + one clip, no mesh) in `glb_url` plus an mp4 `preview_url`, so you can pick the best one and fuse it with your model in a game engine or three.js. mode selects the representation - rot_trans (default, rotation plus translation per bone, most faithful) or rot_only (rotation only, easier to retarget onto another skeleton in an engine). Animation quality is hit-or-miss, which is why multiple candidates are returned. Credits are held once per call regardless of variant count and refunded if the job fails or is cancelled. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per call.

ParametersrequestBodyrequired

animate3DModelPreset

Animate 3D model with a preset

Apply a curated animation preset to an already-rigged 3D model (retargeting). Pass the rigged GLB in `model` (URL or base64; the 3D asset file, not an AI model name) and a `preset_id` from the animation presets list (from listAnimationPresets; any preset id works). Any rig type can take a preset, though retargeting does not succeed on every model: when it does not, the job fails. The job result is one retargeted animation - a standalone animation-only GLB in `glb_url` plus an mp4 `preview_url` - in the same `animations` envelope as the animate endpoint. crop_loop trims the clip to its seamlessly-looping span (omit to follow the preset's own loop flag); in_place removes net travel so the character moves on the spot, as game-engine locomotion expects (omit to keep the preset's own travel). Credits are held when the job is accepted and refunded if it fails or is cancelled. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 0.5 credits per call.

ParametersrequestBodyrequired

createSoundEffect

Create sound effect

Produce a short sound effect (SFX) from a text description, such as "laser gun firing" or "footsteps on gravel". The job result is a single audio result containing the URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The description field is required, duration is capped at 10 seconds (0 means auto-pick based on the description), and you may set loop to true for a seamlessly looping effect. Credits are held when the job is accepted and refunded if it fails or is cancelled. Use this for short, discrete sounds; use createAmbiance for a continuous looping background soundscape, createMusic for musical pieces, and createAudioTransform to remix an existing audio sample. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type audio). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 2 credits per call.

ParametersrequestBodyrequired

createAmbiance

Create ambiance

Produce a looping background ambiance soundscape from a text description, such as "windy forest at dusk" or "busy tavern interior". The job result is a single audio result containing the URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The description field is required and duration is capped at 10 seconds (0 means auto-pick based on the description). Credits are held when the job is accepted and refunded if it fails or is cancelled. Use this for continuous, atmospheric background loops; use createSoundEffect for short discrete sound effects, createMusic for musical pieces, and createAudioTransform to remix an existing audio sample. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type audio). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 2 credits per call.

ParametersrequestBodyrequired

createMusic

Create music

Produce a piece of music from a text description, such as "epic orchestral battle theme" or "calm piano melody", with optional lyrics. The job result is a single audio result containing the URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The description field is required; duration must be one of the allowed values (0 means auto, otherwise multiples of 10 up to 180 seconds) and out-of-range values return HTTP 400. Set loop to true for a seamlessly looping piece. Credits are held when the job is accepted and refunded if it fails or is cancelled. Use this for songs and musical scores; use createSoundEffect for short sound effects, createAmbiance for looping background soundscapes, and createAudioTransform to remix an existing audio sample. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type audio). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 3 credits per call.

ParametersrequestBodyrequired

createAudioTransform

Remix audio

Remix an existing audio sample (a sound effect, ambiance, or music clip) into a variation guided by a text prompt, for example turning a track into an 80s synthwave or metal version. Both the sample and the prompt are required; the sample is uploaded as a URL or base64 audio and must be at most 15MB or the call returns HTTP 400, and duration must be one of the allowed values (0 means match the source, otherwise multiples of 10 up to 180 seconds). The job result is a single audio result containing the URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The optional modification_strength (0 to 1, default 0.6) controls how far the result departs from the original, and loop set to true makes the result loop seamlessly. Credits are held when the job is accepted and refunded if it fails or is cancelled. Use this to transform existing audio you already have; use createSoundEffect, createAmbiance, or createMusic to generate audio from scratch. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type audio). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 3 credits per call.

ParametersrequestBodyrequired

createVoice

Design voice

Design a new voice from a character description (such as "deep-voiced warrior" or "cheerful young girl"), a character image, or both, and have it speak a short line of text, returning a sample of that newly created voice. text is required, plus voice_description or image (an image of the speaking character, given as a URL or base64, makes the description optional); the spoken text is limited to 100 characters or the call returns HTTP 400, and type selects "human" or "non-human" voices. The job result is a single audio result containing the URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). Credits are held when the job is accepted and refunded if it fails or is cancelled. Use this to invent and audition a voice from a description; use createSpeech for text-to-speech that clones a specific voice from an audio sample, and createSpeechPreset for text-to-speech using a named preset voice. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type audio). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 2 credits per call.

ParametersrequestBodyrequired

createSpeech

Speak text in a cloned voice

Convert text to speech by cloning the voice from an audio sample you provide (voice-cloning text-to-speech). Both text and sample are required; the text is limited to 250 characters and the sample is supplied as a URL or base64 audio that must be at most 15MB, with violations returning HTTP 400. An optional delivery note (at most 50 characters, e.g. "angry, shouting") says how the line is said. The job result is a single audio result containing the URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). Credits are held when the job is accepted and refunded if it fails or is cancelled. Use this when you have a reference voice sample to clone; use createSpeechPreset to speak with a built-in named preset voice instead, and createVoice to design a brand-new voice from a text description rather than cloning one. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type audio). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 2 credits per call.

ParametersrequestBodyrequired

createSpeechPreset

Speak text in a preset voice

Convert text to speech using a named built-in preset voice, with optional language and either an emotion or a delivery note, depending on the voice. Both text and voice_preset_id are required and the text is limited to 250 characters. The voices named by a first name (e.g. "Rachel") take a delivery note (at most 50 characters, e.g. "angry, shouting") and no emotion; the descriptive voices (e.g. "Serious woman") take an emotion and no delivery note. Invalid input, including an emotion or delivery note the voice does not take, returns HTTP 400. The job result is a single audio result containing the URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). Credits are held when the job is accepted and refunded if it fails or is cancelled. Use this when you want a ready-made catalog voice and do not need to supply your own sample; use createSpeech to clone a voice from an audio sample instead, and createVoice to design a new voice from a text description. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type audio). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions). Credits: This endpoint consumes 1 credits per call.

ParametersrequestBodyrequired

listGenerations

List past generations

List your generation history across the API and the web app - filter by type, source (api|web|all), text search, and date range. Returns {items, page, page_size, has_more}; keep paging while has_more is true. API-originated results expire after 7 days - download anything you want to retain. For an in-flight job's status use getApiJob instead.

Parameterstyperequiredsearchsourcedate_todate_frompage_sizerequest_idpage_number

listApiJobs

List jobs

List the generation jobs you started through the API or MCP, most recent first. Web-app jobs are not included. This is a free read-only lookup (no credits, no generation). Filter with a comma-separated status list; limit defaults to 50 and is capped at 100.

Parameterslimitstatus

getApiJob

Get job status and results

Poll the status of a generation job started by any tool. Every generation tool returns `{id, status}`; call getApiJob with that id until status is `succeeded` (then read `result`, shaped exactly like the tool's documented output) or `failed` (read `error`). Poll every few seconds, or pass `wait: 30` to long-poll - the call is held up to 30 seconds (max 60) and returns as soon as the job finishes.

Parametersidrequiredwait

cancelApiJob

Cancel job

Cancel a queued job you started through the API or MCP; the credits held for it are refunded. Jobs that are already running cannot be canceled (409). Returns the canceled job. This is free (no credits).

Parametersidrequired

getPricing

Get Ludo plans and pricing

What Ludo's paid service costs and includes, for an agent advising a user: every plan with its monthly and annual price, credits, seats, queue concurrency and what it includes or lacks; credit top-ups and their price brackets; what each API call costs; and the rules to know before telling a user to pay. The ones that matter most: the API, MCP and CLI need an active Pro or Studio plan (Free and Indie get 402 on every other call), and there every generation costs credits - "unlimited" on Pro and Studio is the web app only. Plans are bought in the web app (`links.billing`), not through the API. Plans, prices and rules here are the live ones, the same as https://ludo.ai/pricing. This is a free lookup (no credits, no job) and works with or without an API key, on any plan.

Takes no parameters.

getAccount

Get credits and plan

Show your account's credit balance, plan and auto top-up settings. `credits.available` is what generations can spend right now (plan_credits + extra - used); `resets_at` is when the plan's monthly credits refill (unix seconds). When `team_pool` is true the balance is your team's shared pool, and `auto_topup` is null because the team owner manages it. Check this before an expensive generation instead of waiting for a 402. Buying credits and changing auto top-up happen in the web app at `billing_url`. This is a free read-only lookup (no credits, no generation).

Takes no parameters.

submitApiFeedback

Send feedback to Ludo

Report a problem with the Ludo API itself to the Ludo team. Use it ONLY for API bugs (an error, a failed or stuck job, a crash, a response that does not match this documentation) and API limitations (a parameter, operation or format you needed that the API does not support, and that you could not work around). NEVER use it to report model limitations or the quality of a result: an image, sprite, animation, 3D model, video or sound that looks wrong, ignores part of the prompt, has artifacts or is not what you wanted is not an API bug. Do not report those; retry with a different prompt, model or settings instead. Before reporting a limitation, call searchDocs with what you tried: if the docs already describe it as a known limitation, do not report it. Describe what you were trying to do and what went wrong, and name the operation it relates to. Always send the id of every job the report is about, in job_ids (up to 10): we look at those jobs' inputs and outputs, and a report about a result we cannot find cannot be investigated. Do not include personal data, secrets or file contents. Send one report per issue, and if you are an agent, tell the user what you sent. Free (no credits).

ParametersrequestBodyrequired

Version history

9
  1. v0.16.6LatestNov 5, 2026
  2. v0.16.5Nov 4, 2026
  3. v0.16.4Oct 29, 2026
  4. v0.16.3Oct 19, 2026
  5. v0.16.2Oct 17, 2026
  6. v0.16.1Oct 16, 2026
  7. v0.16.0Oct 15, 2026
  8. v0.15.0Sep 28, 2026
  9. v0.9.0Sep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts