validateApiKeyEndpoint
Validate API key
Validates an API key. Returns 200 if valid, 403 if invalid.
無需輸入參數。

ai.ludo由 ludo.ai 發布官方發布者v0.16.6更新於 Nov 5, 2026
Generate game assets with AI: sprites, animations, 3D models with rigging, video, music, SFX, voices
Ludo AI 的遠端 MCP 伺服器,用來生成遊戲素材:精靈圖、精靈表動畫、3D 模型、方向精靈、影片、音樂、音效與語音。
Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。
把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。
閱讀 https://sourceweft.com/mcp/ai.ludo%2Fgame-assets/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。把它新增到你客戶端的 mcpServers 設定中。
{
"mcpServers": {
"ludo-ai-game-assets": {
"type": "http",
"url": "https://mcp.ludo.ai/mcp",
"headers": {
"Authorization": "Bearer <YOUR_TOKEN>"
}
}
}
}Generate game assets using AI through the Model Context Protocol (MCP).
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.
The server speaks Streamable HTTP at https://mcp.ludo.ai/mcp. Every client sends the key in a header:
Setups for eleven clients, including Windsurf, Cline, Zed and Kiro, are on ludo.ai/developers/mcp.
Add -s user to use it in every project.
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.)
Add to ~/.codex/config.toml:
Add to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):
Add to .vscode/mcp.json, then use Copilot Chat in Agent mode. VS Code asks for the key once and stores it securely:
Bridge with mcp-remote (needs Node.js). Keep the header argument free of spaces and pass the key through env:
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.
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.
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.
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.
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 returnedmessage: Present only when results is empty, which means the documentation does not cover the question. Rephrase it, or browse with getDocsIf the search backend is briefly unavailable the tool returns 503; fall back to getDocs rather than retrying in a loop.
Credits: Free
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.
Returns:
docs: Array of { id, label, sections }, where each section is { title, content }. content is markdown, and is omitted from the table of contentsunmatched_sections / available_sections: Present only when some, but not all, requested titles matched: the titles that matched nothing, and every valid title of docAn 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
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.
Credits: 0.5 per image
editImage)Modify an existing image using text instructions (smart editing).
Credits: 0.5 per image
generateWithStyle)Generate new content while maintaining the visual style of a reference image.
Credits: 0.5 per image
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.
Returns: url, pose, motion_prompt
Example workflow:
generatePosemotion_prompt directly in animateSprite for optimal animation resultsCredits: 0.5 per image
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.
Returns: url, camera_rotation, camera_elevation
Credits: 0.5 per image
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.
Returns: a single result with url (transparent PNG)
Credits: 0.5 per 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.
Returns: a single result with url
Credits: 0.5 per image
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.
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)
create3DModel)Convert a 2D image to a 3D GLB model with textures, optionally rigged in the same call.
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
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.
Returns: a single result with url, to pass as create3DModel's image
Credits: 0.5 per image
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.
Returns: model_url (rigged GLB, skeleton + skin weights baked in), rigged (true)
Credits: 1 per rig Processing time: 60-120 seconds
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.
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
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.
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
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:
create3DModelImage from a prompt, or your own image redrawn as a 3D render.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.preset_id from listAnimationPresets, or an animation_url made for this model by animate3DModelPreset or animate3DModel. With none, the sprites are a still pose.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.listDirectionalSpriteStyles: pick a look.previewDirectionalSprites: check it, free.createDirectionalSprites for animated spritesheets, or createDirectionalStills for still images.fitDirectionalAccessoryFit 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.
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)
attachDirectionalAccessoriesPut 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.
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)
listDirectionalSpriteStylesFree. 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.
previewDirectionalSpritesA 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).
createDirectionalSpritesAt 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
createDirectionalStillsThe 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
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.
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
Applies to animateSprite and animateSpriteKeyframes.
frames and duration.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.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.
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
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_idperspectives: 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
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.
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
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.
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)
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.
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)
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.
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
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.
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.
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.
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.
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).
Returns: url, duration, has_audio
Credits: Griffin HD: 2 credits/sec (5s = 10)
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.
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)
createSoundEffect)Generate game sound effects from text descriptions.
Credits: 2 per sound
createAmbiance)Generate ambient soundscapes and background atmospheres from text descriptions.
Credits: 2 per generation
createMusic)Generate background music and themes.
Credits: 3 per track
createAudioTransform)Remix or transform an existing audio sample using a text prompt.
Credits: 3 per generation
createVoice)Generate unique character voices.
Credits: 1 per voice
createSpeech)Clone a voice from an audio sample.
Credits: 1 per generation
createSpeechPreset)Use preset voices for text-to-speech.
Credits: 1 per generation
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).
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
listApiJobs)List the generation jobs you started through the API or MCP, most recent first. Web app jobs are not included.
Returns: Array of job objects with id, status, and timestamps
Credits: Free
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).
Returns: The canceled job
Credits: Free, and the queued job's credits are refunded
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.
Returns: items, page, page_size, has_more. Keep paging while has_more is true
Credits: Free
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
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
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.
Returns: ok and the report's id
Credits: Free
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.)
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).
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.
429 with code PENDING_JOBS_LIMIT; wait for jobs to finish, then submit again.429 carries Retry-After.searchDocs), per API key.convertToPixelArt, adjustSpritesheet, fitDirectionalAccessory and attachDirectionalAccessories.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:
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.
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.
Full API documentation with all parameters and response formats: api.ludo.ai/api-documentation
Proprietary - See ludo.ai/terms for terms of service.
來源:README.md,提交 c413288
Validate API key
Validates an API key. Returns 200 if valid, 403 if invalid.
無需輸入參數。
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.
requestBody必填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.
requestBody必填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.
requestBody必填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
requestBody必填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
requestBody必填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.
requestBody必填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.
requestBody必填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
requestBody必填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.
docsectionsSearch 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.
nquery必填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).
無需輸入參數。
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
requestBody必填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
requestBody必填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).
requestBody必填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.
requestBody必填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.
無需輸入參數。
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.
requestBody必填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).
requestBody必填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).
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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).
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
requestBody必填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.
type必填searchsourcedate_todate_frompage_sizerequest_idpage_numberList 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.
limitstatusGet 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.
id必填waitCancel 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).
id必填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.
無需輸入參數。
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).
無需輸入參數。
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).
requestBody必填已滿足適用檢查項的 100%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
Authorization: ApiKey YOUR_API_KEYclaude mcp add --transport http ludo https://mcp.ludo.ai/mcp --header "Authorization: ApiKey YOUR_API_KEY"[mcp_servers.ludo]url = "https://mcp.ludo.ai/mcp"
[mcp_servers.ludo.http_headers]Authorization = "ApiKey YOUR_API_KEY"{ "mcpServers": { "ludo": { "url": "https://mcp.ludo.ai/mcp", "headers": { "Authorization": "ApiKey YOUR_API_KEY" } } }}{ "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 mcp add -s user --transport http --header "Authorization: ApiKey YOUR_API_KEY" ludo https://mcp.ludo.ai/mcp{ "mcpServers": { "ludo": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.ludo.ai/mcp", "--header", "Authorization:${LUDO_AUTH}"], "env": { "LUDO_AUTH": "ApiKey YOUR_API_KEY" } } }}# 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": "...", ... } }# 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"Create a pixel art knight character with sword and shield, side view, 16-bit styleGenerate an isometric treasure chest icon for a mobile RPGCreate a low-poly stylized tree for a casual mobile gameAnimate this character with a smooth walking cycle, 16 framesCreate an idle breathing animation for this character spriteRig this 3D character using Mixamo joint names, then apply a walk animation preset to itAnimate this fire sprite as a looping VFX effectCreate a satisfying coin pickup sound effect for a platformerGenerate an epic orchestral boss battle theme, intense and dramaticCreate a voice for a wise old wizard saying "The journey begins now"