Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "adjustSpritesheet", "animateSprite", "animateSpriteKeyframes" and 3 more
⟨124 unchanged words⟩ to upscale it 1.5x (`frame_size` -1),orto turn loop trimming on oroff.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 ⟨102 unchanged words⟩
⟨370 unchanged words⟩ ","example":false,"type":"boolean"},"use_pixel_grid":{"description":"Use the animation's pixel grid if one is detected. true: when Ludo detects a pixel grid with confidence, the sheet is packed on it (logical pixels, scaled up by whole blocks); when none is detected, this has no effect. false: always pack as ordinary art, for when the detected grid is wrong for your asset (for example a smooth sprite coming back as coarse blocks). Ignored for forge-pixel animations, which are always packed on their grid. Unset keeps the source spritesheet's setting (true unless it was made with false). Re-cutting with false fixes a sheet whose detected grid is wrong without generating it again.","type":"boolean"}},"required":["spritesheet_url"],"type": ⟨5 unchanged words⟩
⟨1587 unchanged words⟩ ","example":false,"type":"boolean"},"use_pixel_grid":{"description":"Use the animation's pixel grid if one is detected. Defaults to true. true: when Ludo detects a pixel grid with confidence, the sheet is packed on it (logical pixels, scaled up by whole blocks); when none is detected, this has no effect. false: always pack as ordinary art, for when the detected grid is wrong for your asset (for example a smooth sprite coming back as coarse blocks). Ignored for forge-pixel animations, which are always packed on their grid.","type":"boolean"}},"required":["motion_prompt","initial_image"], ⟨6 unchanged words⟩
⟨1524 unchanged words⟩ ","example":false,"type":"boolean"},"use_pixel_grid":{"description":"Use the animation's pixel grid if one is detected. Defaults to true. true: when Ludo detects a pixel grid with confidence, the sheet is packed on it (logical pixels, scaled up by whole blocks); when none is detected, this has no effect. false: always pack as ordinary art, for when the detected grid is wrong for your asset (for example a smooth sprite coming back as coarse blocks). Ignored for forge-pixel animations, which are always packed on their grid.","type":"boolean"}},"type":"object"}},"required": ⟨3 unchanged words⟩
⟨640 unchanged words⟩ ","example":false,"type":"boolean"},"use_pixel_grid":{"description":"Use the animation's pixel grid if one is detected. true: when Ludo detects a pixel grid with confidence, the sheet is packed on it (logical pixels, scaled up by whole blocks); when none is detected, this has no effect. false: always pack as ordinary art, for when the detected grid is wrong for your asset (for example a smooth sprite coming back as coarse blocks). Ignored for forge-pixel animations, which are always packed on their grid. Unset keeps the source spritesheet's setting (true unless it was made with false).","type":"boolean"}},"required":["spritesheet_url"],"type": ⟨5 unchanged words⟩
⟨514 unchanged words⟩ ","example":false,"type":"boolean"},"use_pixel_grid":{"description":"Use the animation's pixel grid if one is detected. true: when Ludo detects a pixel grid with confidence, the sheet is packed on it (logical pixels, scaled up by whole blocks); when none is detected, this has no effect. false: always pack as ordinary art, for when the detected grid is wrong for your asset (for example a smooth sprite coming back as coarse blocks). Ignored for forge-pixel animations, which are always packed on their grid. Unset keeps the source spritesheet's setting (true unless it was made with false).","type":"boolean"}},"required":["spritesheet_url","image"], ⟨6 unchanged words⟩
⟨1035 unchanged words⟩ "example":false,"type":"boolean"},"use_pixel_grid":{"description":"Use the animation's pixel grid if one is detected. Defaults to true. true: when Ludo detects a pixel grid with confidence, the sheet is packed on it (logical pixels, scaled up by whole blocks); when none is detected, this has no effect. false: always pack as ordinary art, for when the detected grid is wrong for your asset (for example a smooth sprite coming back as coarse blocks). Ignored for forge-pixel animations, which are always packed on their grid.","type":"boolean"},"video":{"description":"URL of the video ⟨81 unchanged words⟩
Changed the definition of "createSoundEffect", "editImage", "generatePose" and 1 more
⟨97 unchanged words⟩ },"duration":{"description":"Duration inseconds.seconds, 0.5 to 10. Use 0 for automatic duration based on the description. Shorter requests are generated at 0.5 s. Default: 0.","example":0,"format" ⟨60 unchanged words⟩
⟨9 unchanged words⟩ based on text instructions","properties":{"augment_prompt":{"description":"Rewrites your prompt behind the scenes into the form the model works best with. Leave it on (the default). Turning it off does not give you more control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type":"boolean"},"
Added "create3DModelImage"; changed the definition of "create3DModel" and "editImage" (43 tools before, 44 now)
⟨99 unchanged words⟩ 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 ⟨143 unchanged words⟩
⟨71 unchanged words⟩ 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
Changed the definition of "editImage"
⟨29 unchanged words⟩ 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. The job result is an array of image ⟨125 unchanged words⟩ Credits: This endpoint consumes 0.5 credits perresult.result; 1 credit per result with a mask.
⟨179 unchanged words⟩ ":"sprite","type":"string"},"mask":{"description":"Optional URL or base64-encoded PNG that limits the edit to one area of the image. White marks the area to change, black the area to keep. It must be exactly the same width and height as `image`, or the call returns 400. Without a mask the whole image is re-rendered, which can shift colours and details outside the part you meant to change. A masked edit costs more than an unmasked one (see the price).","example":"<url> OR data:image/png;base64,...","type":"string"},"mask_mode":{"description":"Only with `mask`. \"replace\" (the default) redraws the masked area from `prompt`; \"erase\" removes what is in the masked area and takes no prompt.","enum":["replace","erase"],"example":"replace","type":"string"},"
Changed the definition of "animate3DModel", "animate3DModelPreset", "create3DModel" and 1 more
Only numbers and dates differ: this server embeds live figures in the definition, so the text moves without the contract changing.
⟨172 unchanged words⟩ server instructions). Credits: This endpoint consumes0.20.5 credits per call.
Only numbers and dates differ: this server embeds live figures in the definition, so the text moves without the contract changing.
⟨168 unchanged words⟩ server instructions). Credits: This endpoint consumes0.20.5
Changed the definition of "adjustSpritesheet", "animate3DModel", "animate3DModelPreset" and 40 more
before
—after
Adjust spritesheet exportbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Adjust spritesheet export"}before
—Added "createDirectionalSprites", "createDirectionalStills", "listDirectionalSpriteStyles" and 2 more; changed the definition of "create3DModel" (38 tools before, 43 now)
⟨128 unchanged words⟩ or "none", default "pbr"). Pass rig true to also rig the model in the same call (rig_type and 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 ⟨59 unchanged words⟩ 15 credits per call with model "hero".; rig true adds 1 credit when the model comes back rigged.
⟨115 unchanged words⟩ :image/png;base64,...","type":"string"},"joint_naming":{"description":"With rig, the bone naming convention (as rigModel's joint_naming). Purely a relabel - the skeleton is identical. Default: \"smpl\".","enum":["smpl","mixamo","humanik","unreal","godot","rigify","vroid"],"example":"smpl","type":"string"},"
Changed the definition of "createSpeech", "createSpeechPreset" and "createVoice"
⟨20 unchanged words⟩ sample are required; the text is limited to1000250 characters and the sample is supplied as a ⟨8 unchanged words⟩ 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 ⟨107 unchanged words⟩ server instructions). Credits: This endpoint consumes12 credits per call.
⟨6 unchanged words⟩ generation using voice cloning","properties":{"delivery":{"description":"How the line is said, e.g. \"angry, shouting\" or \"whispering, out of breath\" (max 50 characters).","maxLength":50,"type":"string"},"
Changed the definition of "adjustSpritesheet"
⟨196 unchanged words⟩ ). Limited to 20 calls per 5 minutes, 120 an hour and2001000 a day. Pass an optional request_id to tag ⟨30 unchanged words⟩
Changed the definition of "animateSprite", "animateSpriteKeyframes", "editSpritesheet" and 1 more
⟨134 unchanged words⟩ requested, `gif_url`, `individual_frame_urls` and `spritesheet_with_background_url`. The hydramodeland hydra-plus models alsoreturnsreturn `audio_url`, a sound effect for the animation ⟨231 unchanged words⟩ Hydra 3/s (shortest duration 3s, so 9 credits minimum), Hydra+ 4/s (shortest duration 3s, so 12 credits minimum), Forge 1.5/s, Forge Pixel ⟨49 unchanged words⟩
before
{"properties":{"requestBody":{"description":"Payload for generating an animated spritesheet from a static image. Input images can either be provided in base64 or URL. If the image was generated using Ludo, ideally it should be generated using the \"sprite\", \"sprite-vfx\" or \"ui_asset\" type.","properties":{"augment_prompt":{"description":"Rewrites your prompt behind the scenes into the form the model works best with. Leave it on (the default). Turning it off does not give you more control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type":"boolean"},"crop":{"description":"Crop sprite frames to fit content. Results in smaller spritesheets but inconsistent frame sizes across different animations. Default: true.","example":true,"type":"boolean"},"duration":{"description":"Duration in seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- forge: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- blitz: 1.2, 1.5, 2, 2.5, 3, 3.5, 4\n- eagle: 1, 2, 3, 4\n- eagle-audio: 1, 2, 3, 4 Default: 3.","example":3,"format":"float","type":"number"},"final_image":{"description":"The url OR base64 of ending frame image. When provided, the animation will interpolate between the initial and final frames.","example":"<url> OR data:image/png;base64,...","type":"string"},"frame_size":{"description":"Size of the sprite in pixels, not of the frame: it sets how big the character is drawn in the exported sheet, and each frame also holds the space around the sprite, so frames come out larger than this value. It changes the export only, not how the sprite is generated. 0 is maximum resolution. -1 is AI 1.5x upscaling. -9 is True Size: frames keep the size and position of the input frame, untrimmed, so the spritesheet lines up exactly with the input image - use it (not margin_ratio_mode \"none\") whenever the output must align with your input; it works with any margin mode. Exporting larger than the input image adds no detail: do not pick a size above the input's own resolution, and 0 or -1 gain nothing on inputs under 512 px. True Size crops at the input image's edges, so anything the animation adds beyond them (an aura, a spell effect, a swung weapon) is cut off: use a fixed size or 0 for those. adjustSpritesheet re-exports a finished animation at another size for free. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -1, -9. Default: 0.","example":0,"format":"integer","type":"number"},"frames":{"description":"Maximum number of frames in the output spritesheet. Allow about one second of duration per 16 frames - above that the model may not be able to produce them all (64 frames needs a duration of at least 4). The result can have fewer frames when the duration is short or bad frames were removed. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36.","example":36,"format":"integer","type":"number"},"gif":{"description":"When true, generates an animated GIF from the spritesheet and returns it in gif_url. Disabled by default to reduce response time. Default: false.","example":false,"type":"boolean"},"image_type":{"description":"Type of sprite being animated. Affects generation parameters and styling. Tiling types (horizontal / vertical tiles, scrolling backgrounds, parallax layers, textures) stay seamless only on forge and forge-pixel, and only if the input image itself already wraps seamlessly on that axis; otherwise the animation shows a visible seam when tiled. Default: \"sprite\".","enum":["sprite","sprite-vfx","item-icon","ui_asset","logo","sprite-tiling-horizontal","sprite-tiling-vertical","parallax_layer","tile","texture","portrait","card-art"],"example":"sprite","type":"string"},"individual_frames":{"description":"When true, extracts each frame from the spritesheet as an individual image and returns the URLs in individual_frame_urls. Default: false.","example":false,"type":"boolean"},"initial_image":{"description":"The url OR base64 of the starting frame image to animate. This is the base sprite that will be brought to life.","example":"<url> OR data:image/png;base64,...","type":"string"},"loop":{"description":"Trim the animation at the beginning or end to create a seamless loop. Not guaranteed to produce a perfect loop. Default: true.","example":true,"type":"boolean"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends sideways (sword slashes, punches) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"margin_ratio_mode":{"description":"How the sprite is framed for generation. The model always generates on a canvas of the same size, so any margin is canvas the sprite does not fill: the more margin, the lower the resolution and detail of the sprite. \"auto\" (default, recommended) trims and centers the sprite and picks a margin suited to the motion. \"manual\" uses margin_ratio_horizontal / margin_ratio_vertical; keep them as tight as the motion allows (about 0.15) and raise only the axis the motion needs. \"none\" animates the input exactly as framed, with no trimming and no margin added, so the input must already have suitable margins: a sprite touching the edges gets its limbs, weapons and effects cut off as soon as it moves, and an image that is mostly empty space yields a small, low-detail sprite. \"none\" is the way to keep a deliberately off-center sprite (e.g. a character at the left edge firing a beam to the right), but results can be unpredictable. Do not use \"none\" to make the spritesheet line up with the input image - use frame_size -9 (True Size) for that; it works with any margin mode. Rules: omit margin_ratio_mode and send margin_ratio_horizontal / margin_ratio_vertical to get \"manual\" automatically; \"manual\" with no margin value fails with HTTP 400; \"auto\" or \"none\" sent together with a margin value fails with HTTP 400 (the value would be ignored). Default: \"auto\".","enum":["auto","manual","none"],"example":"auto","type":"string"},"margin_ratio_vertical":{"description":"Vertical padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends up or down (jumps) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"model":{"description":"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, shortest duration 3s, so 9 credits minimum · Most capable all-around model, generates audio\n- \"forge\" (Forge): 1.5 credits/s · Sharper detail, simpler motion. Best for simple body shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s · Best for low-res pixel art animations\n- \"blitz\" (Blitz): 1.9 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\n- \"eagle\" (Eagle): 2.6 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\n- \"eagle-audio\" (Eagle with Audio): 3.1 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\nLegacy aliases: \"standard\" → blitz.\nModels marked LEGACY still work for existing integrations but will be removed; pick a current model for anything new.\nforge-pixel expects real pixel art - a perfect pixel grid at its natural resolution; for other art use hydra or forge. Tiling image types stay seamless only on forge and forge-pixel. Default: \"hydra\".","enum":["hydra","forge","forge-pixel","blitz","standard","eagle","eagle-audio"],"example":"hydra","type":"string"},"motion_prompt":{"description":"Text description of the desired animation, e.g. \"walking\", \"idle breathing\", \"attack slash\", \"casting a fireball with both hands\". Describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them. Do not over-describe, though: too much detail can harm the animation, and an action the model already knows should be named, not decomposed into its steps (\"walking\", never \"move the left foot forward, then the right foot\"). Do not restate what initial_image already shows (the character, its appearance and equipment, the art style, the background, the lighting, the camera), and leave frame count and timing to the frames and duration fields. Negative phrasing (\"no background\", \"do not move the camera\", \"without a weapon\") works only on hydra. On forge, forge-pixel and the legacy models it backfires: naming something you do not want makes it more likely to appear, so \"without a weapon\" tends to produce a weapon. On those models never phrase anything negatively; state only what should happen, and control everything else through the image and the other fields. Keep it well under 100 words: in longer prompts details start competing and some get dropped.","type":"string"},"request_id":{"description":"Optional client-provided identifier, unique per request. Re-sending the same request_id returns the existing job instead of generating again. Also usable as the request_id filter of listGenerations.","type":"string"},"spritesheet_with_background":{"description":"When true, also returns the spritesheet with background intact (before background removal). Useful for manually fixing background removal issues. The with-background spritesheet URL will be in spritesheet_with_background_url. Default: false.","example":false,"type":"boolean"}},"required":["motion_prompt","initial_image"],"type":"object"}},"required":["requestBody"],"type":"object"}Changed the definition of "create3DModel" and "rigModel"
⟨27 unchanged words⟩ 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 ⟨5 unchanged words⟩ of the model follows it instead of beinginvented.invented - hero takes the front image only and rejects a back_image with HTTP 400. Accepts optional mesh controls: target_num_faces (max triangle ⟨74 unchanged words⟩ Credits: This endpoint consumes 4 credits percall.call with model "prop" (default), 15 credits per call with model "hero".
Changed the definition of "submitApiFeedback"
⟨147 unchanged words⟩ 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 andjob_idoutputs,whenandthereaisreportone)aboutitarelatesresultto.we cannot find cannot be investigated.
Changed the definition of "animate3DModelPreset", "create3DModel", "createSpeechPreset" and 2 more
⟨32 unchanged words⟩ `preset_id` from the animation presets list (fromlistAnimationPresets) - only presets that expose a `clip_url` can be appliedlistAnimationPresets;toanyapreset3Didmodel.works). The model must have a humanoid-template rig ( ⟨120 unchanged words⟩
⟨94 unchanged words⟩ Changed the definition of "adjustSpritesheet"
⟨117 unchanged words⟩ frame count or size for your engine, to upscale it 1.5x (`frame_size` -1), or to turn loop trimming on or off. ⟨106 unchanged words⟩
⟨97 unchanged words⟩ keep the source's setting. 0 is maximum resolution. -1 is AI 1.5x upscaling, which gains nothing on sources under 512 px. -9 is True Size: frames keep the size ⟨33 unchanged words⟩ 96, 128, 192, 256, 384, 0, -1, -9.","format":"integer","type" ⟨212 unchanged words⟩
Changed the definition of "animateSprite", "animateSpriteKeyframes", "createVideo" and 5 more
⟨196 unchanged words⟩ the job is accepted; the final charge ismax(rate × seconds of video generated,the(legacymodel'smodels keep their minimum charge), never more than for the ⟨107 unchanged words⟩ - see the `model` field for the per-modelrates and the 4-credit minimum charge on forge/forge-pixel.rates. Pass an optional request_id to tag the result ⟨33 unchanged words⟩ × seconds, per model: Hydra 3/s (minshortestchargeduration
Changed the definition of "animateSprite", "animateSpriteKeyframes" and "transferMotion"
⟨687 unchanged words⟩ "example":true,"type":"boolean"},"margin_ratio":{"deprecated":true,"description":"Deprecated: prefermargin_ratio_horizontal/ margin_ratio_vertical. Amount of padding around the sprite as a ratio (0.0 to 1.0). Sets both axes to this value. A per-axis value, when also given, overrides this for that axis. Supplying any margin value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite ⟨53 unchanged words⟩ margin_ratio_mode \"manual\" unless margin_ratio_mode is setexplicitly; overrides the legacy margin_ratio on this axis.explicitly.","format":"float","type":"number ⟨311 unchanged words⟩ margin_ratio_mode \"manual\" unless margin_ratio_mode is setexplicitly; overrides the legacy margin_ratio on this axis.explicitly.","format":"float","type":"number
Changed the definition of "adjustSpritesheet", "animateSprite", "animateSpriteKeyframes" and 3 more
⟨58 unchanged words⟩ },"frame_size":{"description":"Size ofeachtheframesprite in pixels,(widthnot of the frame: it sets how big the character is drawn, andheight).each frame also holds the space around it, so frames come out larger than this value. Omit to keep the source'sframe size.setting. 0 is maximum resolution. -9 is True Size ⟨259 unchanged words⟩
Added "adjustSpritesheet"; changed the definition of "animateSprite" and "animateSpriteKeyframes" (37 tools before, 38 now)
⟨331 unchanged words⟩ -1 gain nothing on inputs under 512 px. True Size crops at the input image's edges, so anything the animation adds beyond them (an aura, a spell effect, a swung weapon) is cut off: use a fixed size or 0 for those. adjustSpritesheet re-exports a finished animation at another size for free. Accepted values: 32, 64, 96, 128, ⟨1231 unchanged words⟩
⟨321 unchanged words⟩ -1 gain nothing on inputs under 512 px. True Size crops at the input image's edges, so anything the animation adds beyond them (an aura, a spell effect, a swung weapon) is cut off: use a fixed size or 0 for those. adjustSpritesheet re-exports a finished animation at another size for free.
Added "rotateSpritesheet" (36 tools before, 37 now)
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 produc…
Changed the definition of "animate3DModel", "animateSprite", "animateSpriteKeyframes" and 13 more
⟨2 unchanged words⟩ {"properties":{"augment_prompt":{"description":"RewriteRewrites the prompt into a detailed motion caption with anLLMLLM. Leave it on (recommendedthe default). Turning it off does not give you more control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨196 unchanged words⟩
Changed the definition of "editImage"
⟨82 unchanged words⟩ which keeps its own type. Set it whenyouthepassimagebase64is an upload oranaexternallinkURLfrom elsewhere, so a sprite is edited as a ⟨150 unchanged words⟩
Changed the definition of "animateSprite", "animateSpriteKeyframes", "editImage" and 3 more
⟨384 unchanged words⟩ × seconds, per model: Hydra 3/s (shortest duration 3s,minsocharge 9 creditsminimum), Forge 1.5/s (min charge 4 credits) ⟨55 unchanged words⟩
⟨684 unchanged words⟩ \"hydra\" (Hydra): 3 credits/s,shortest duration 3s,minsocharge 9 creditsminimum· Most capable all-around model, generates audio\n-
Changed the definition of "animateSprite", "animateSpriteKeyframes", "createAmbiance" and 9 more
⟨182 unchanged words⟩ model/duration combinations return HTTP 400. Credits are held for the duration you requested when the job isaccepted andaccepted; the final charge is max(rate × seconds of video generated, the model's minimum charge), never more than for the duration you requested,(rateand×theduration,difference (or everything, if themodel'sjob
Changed the definition of "animateSprite", "animateSpriteKeyframes", "editSpritesheet" and 1 more
⟨186 unchanged words⟩ 400. Credits are held when the job isaccepted;acceptedtheandfinalthe charge ismaxfor the duration you requested (rate ×produced secondsduration, or the model's minimum charge if higher),neverevenmorethoughthanthe
Changed the definition of "create3DModel"
Convert asinglesource image into a textured 3D model (image-to-3D ⟨16 unchanged words⟩ rendered from different angles (handy for previews). image is the front view; pass an optional back_image (the same subject seen from behind) so the back of the model follows it instead of being invented. Accepts optional mesh controls: target_num_faces (max triangle ⟨82 unchanged words⟩
{"properties":{"requestBody":{"properties":{"back_image":{"description":"Optional URL or base64-encoded image of the SAME subject seen from behind (rotated 180 degrees from image). The model's back then follows it instead of being invented from the front view alone. It must show the same subject, at the same scale and in the same pose and style as image. Only a back view is supported: a side or three-quarter view here produces a distorted model. No extra cost.","example"
Added "submitApiFeedback" (35 tools before, 36 now)
Send feedback to the Ludo team: a limitation you could not work around, a bug, a result that did not match the documentation, a capability you needed that Ludo does not offer yet, or praise for something that worked well. Describe what you were trying to do and what was missing, and name the operation (and job_id, when there is one) it relates to. 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).
Changed the definition of "animateSprite", "animateSpriteKeyframes", "createSpriteAudio" and 2 more
⟨136 unchanged words⟩ `individual_frame_urls` and `spritesheet_with_background_url`. The hydra model also returns`audio_b64``audio_url`, a sound effect for the animation - ⟨276 unchanged words⟩
⟨70 unchanged words⟩ keyframes. Runs on hydra (default; also returns`audio_b64``audio_url`), forge, or forge-pixel for pixel-art sprites ⟨40 unchanged words⟩ grid fields, optional GIF and frame URLs,
Added "getAccount"; changed the definition of "cancelApiJob", "listApiJobs" and "listGenerations" (34 tools before, 35 now)
Cancel a queued job you started through the API,MCPorCLI;MCP; the credits held for it are refunded. Jobs ⟨19 unchanged words⟩
List the generation jobs you started through the API,MCPorCLIMCP, most recent first. Web-app jobs are not
Changed the definition of "cancelApiJob", "listApiJobs" and "listGenerations"
Cancel a queued job you started through the API, MCP orMCP;CLI; the credits held for it are refunded. Jobs ⟨19 unchanged words⟩
List the generation jobs you started through the API, MCP orMCPCLI, most recent first. Web-app jobs are not ⟨27 unchanged words⟩
Changed the definition of "animateSprite", "animateSpriteKeyframes" and "editSpritesheet"
⟨32 unchanged words⟩ 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 ⟨340 unchanged words⟩
⟨848 unchanged words⟩ "description":"Text description of the desired animation,(e.g.,\"walking\", \"jumping\idle breathing\", \"idleattack
Changed the definition of "animateSprite", "animateSpriteKeyframes", "editSpritesheet" and 1 more
⟨692 unchanged words⟩ , so 9 credits minimum · Most capable all-around model, generates audio\n- \"forge\" (Forge): 1.5 credits/s, min charge 4 credits ·BestUse only for basic animations andrelativelysimplesprites\n-sprites. Multiple tries might be needed\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s ⟨212 unchanged words⟩
Changed the definition of "animate3DModel", "animate3DModelPreset", "animateSprite" and 29 more
⟨10 unchanged words⟩ the rigged GLB in `model` (URL orbase64base64; the 3D asset file, not an AI model name) and a motion `prompt` (e.g. "walking" ⟨7 unchanged words⟩ already have a skeleton - rig it firstvia the rigwithendpointrigModel if not. The job result is num_variants candidate ⟨39 unchanged words⟩ mode selects the representation - rot_trans (default, rotation plus translation per bone, most faithful) or rot_only (forrotationretargetingonly, easier to retarget onto another skeleton in an engine). Animation quality is hit-or-miss, which is why multiple candidates are returned. Credits arecharged
Added "createSpriteAudio" and "searchDocs"; changed the definition of "animateSprite", "animateSpriteKeyframes", "create3DModel" and 7 more (32 tools before, 34 now)
⟨245 unchanged words⟩ varies by model and duration (credits/sec): Hydra 3/s (min 4), Blitz 1.9/s (min 4), Eagle 2.6/s ( ⟨28 unchanged words⟩
⟨127 unchanged words⟩ seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- blitz: 1.2, 1.5, 2, 2.5, 3 ⟨14 unchanged words⟩ 1.5, 2, 2.5, 3, 3.5,4\n-4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 Default: 3.","example":3,"format":
Changed the definition of "createVideo", "createVideoFromReferences" and "editVideo"
⟨192 unchanged words⟩ Blitz 1/s, Eagle 1.3/s, Eagle with Audio1.8/s, Forge Pixel 2/s (min 4);1.8/s; see this endpoint's full pricing table in the API docs.
⟨85 unchanged words⟩ 10, 11, 12, 13, 14,15\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 415 Default: 5.","example":3,"format" ⟨93 unchanged words⟩ 8/10 · Motion Stability: 5/10 · 1.8credits/s\n- \"forge-pixel\" (Forge Pixel): 2 credits/s, min 4\nLegacycredits/s\nLegacy aliases: \"standard\" → blitz. Default: ⟨4 unchanged words⟩ :["blitz","standard","eagle","eagle-audio","forge-pixel
Changed the definition of "getDocs"
⟨122 unchanged words⟩ thousands of characters, so prefer naming thesections.sections, using titles copied from the table of contents. Section titles matchcase-insensitivelyignoring case, spacing andanpunctuation,unknownbut`doc`are never guessed: when only some requested titles exist you receive those sections plus `unmatched_sections` and `available_sections`, and when none exist (orsection`doc`title
Certificate recorded, valid to 2026-11-30
Authorization not required
Recently observed → Live
First tool surface recorded: 32 tools (server version 0.9.9)
Showing the latest 39 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨9 unchanged words⟩ for an existing sprite","properties":{"augment_prompt":{"description":"Rewrites your prompt behind the scenes into the form the model works best with. Leave it on (the default). Turning it off does not give you more control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type":"boolean"},"description":{"description":"Optional additional instructions or ⟨174 unchanged words⟩
⟨9 unchanged words⟩ of an existing sprite","properties":{"augment_prompt":{"description":"Rewrites your prompt behind the scenes into the form the model works best with. Leave it on (the default). Turning it off does not give you more control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type":"boolean"},"camera_elevation":{"description":"Optional camera elevation/tilt in ⟨151 unchanged words⟩
⟨329 unchanged words⟩ of the changes to make (e.g., \"remove the background\", \"add clouds to the sky\", \"make ⟨20 unchanged words⟩ mask, describe what should fill the masked area. Describe only the change, never the background's transparency (\"transparent background\", \"on transparency\", \"transparent padding\"); asking for it often paints a checkerboard into the pixels instead. A sprite keeps its transparent background on its own, and removeBackground is the tool for removing one.","type":"string"},"reference_image":{ ⟨65 unchanged words⟩
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.…
⟨137 unchanged words⟩ also rig the model in the same call,(rig_typewithandthe general rig (joint_naming as in rigModel), ready for animate3DModelPreset ⟨101 unchanged words⟩
⟨245 unchanged words⟩ and skin weights) in the same call,as rigModel would,so it can be animated or rendered with createDirectionalSprites.Adds the rigModel price, charged only when the model comes backItriggedgets(theresult's rigged). Default: false.","example":false,"type":"boolean"},"rig_type":{"description":"Withgeneral rig, whichskeleton tosuitsbuildany(asshape;rigModel'sthererig_type).ishumanoid_templateno(default,rig22typejoints)toandpickhumanoid_template_handshere (52, fiverigModelfingersoffersperthehandothers)suit two-armed, two-legged characters; general suits any shape..AnimationAddspresetstheandrigModelcreateDirectionalSprites'price,preset_idchargedretargetonlyontowhenanytheofmodelthem,comesthoughbacknotriggedonto(theeveryresult'smodel.rigged). Default:\"humanoid_template\".","enum":["general","humanoid","game","humanoid_template","humanoid_template_handsfalse."],"example":"humanoid_template"false,"type":"stringboolean"},"target_num_faces":{"description":"Maximum triangle ⟨55 unchanged words⟩
⟨37 unchanged words⟩ ,"sprite-generator","audio-generator","api-mcp","game-asset-generation","directional-sprites"],"type":"string"},"sections":{ ⟨76 unchanged words⟩
after
Animate 3D modelbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Animate 3D model"}before
—after
Animate 3D model with a preset⟨38 unchanged words⟩ (from listAnimationPresets; any preset id works).TheAnymodelrigmusttypehavecan take ahumanoid-templatepreset,rigthough(rigretargeting does not succeed on every model: when itwithdoesrig_typenot,humanoid_templatetheorjobhumanoid_template_hands).fails. The job result is one retargeted animation - ⟨104 unchanged words⟩
⟨69 unchanged words⟩ not an AI model name). Rig it first, with rigModelusingorrig_typewithhumanoid_templatecreate3DModel'sorrighumanoid_template_hands(anyfirst.rig type).","example":"<url> OR data:model/gltf-binary;base64,... ⟨59 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Animate 3D model with a preset"}before
—after
Animate spritebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Animate sprite"}before
—after
Animate sprite from keyframesbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Animate sprite from keyframes"}before
—after
Cancel jobbefore
—after
{"destructiveHint":true,"idempotentHint":true,"readOnlyHint":false,"title":"Cancel job"}before
—after
Create 3D model⟨303 unchanged words⟩ humanoid_template_hands (52, five fingers per hand)aresuitthetwo-armed,onestwo-leggedanimationcharacters; general suits any shape. Animation presets and createDirectionalSprites' preset_idneed,retargetandontoonlyanysuitoftwo-armedthem,two-legged characters; use generalthoughfornotcreaturesontoandeveryobjects.model. Default: \"humanoid_template\".","enum":[ ⟨68 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create 3D model"}before
—after
Create ambiancebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create ambiance"}before
—after
Remix audiobefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Remix audio"}before
—after
Create directional sprites⟨54 unchanged words⟩ preset from listAnimationPresets, retargeted onto the model;needsanyarighumanoid_templatetypeorcanhumanoid_template_handstakerigone, 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 ⟨159 unchanged words⟩
⟨365 unchanged words⟩ id from listAnimationPresets, retargeted onto the model.TheAnymodelrigneedstypeacanhumanoid_templatetakeorone;humanoid_template_handswhenrig.the preset cannot be retargeted onto the model, the call returns an error. At most one of animation_url, preset_id and ⟨147 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create directional sprites"}before
—after
Create directional stillsbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create directional stills"}before
—after
Create imagebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create image"}before
—after
Create musicbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create music"}before
—after
Create sound effectbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create sound effect"}before
—after
Speak text in a cloned voicebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Speak text in a cloned voice"}before
—after
Speak text in a preset voicebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Speak text in a preset voice"}before
—after
Create sound for a spritesheetbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create sound for a spritesheet"}before
—after
Create videobefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create video"}before
—after
Create video from reference imagesbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create video from reference images"}before
—after
Design voicebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Design voice"}before
—after
Edit imagebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Edit image"}before
—after
Edit spritesheetbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Edit spritesheet"}before
—after
Edit videobefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Edit video"}before
—after
Re-pose spritebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Re-pose sprite"}before
—after
Create image in a reference stylebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Create image in a reference style"}before
—after
Get credits and planbefore
—after
{"readOnlyHint":true,"title":"Get credits and plan"}before
—after
Get job status and resultsbefore
—after
{"readOnlyHint":true,"title":"Get job status and results"}before
—after
Browse Ludo docsbefore
—after
{"readOnlyHint":true,"title":"Browse Ludo docs"}before
—after
List animation presetsbefore
—after
{"readOnlyHint":true,"title":"List animation presets"}before
—after
List jobsbefore
—after
{"readOnlyHint":true,"title":"List jobs"}before
—after
List directional sprite stylesbefore
—after
{"readOnlyHint":true,"title":"List directional sprite styles"}before
—after
List past generationsbefore
—after
{"readOnlyHint":true,"title":"List past generations"}before
—after
Preview directional sprites⟨255 unchanged words⟩ id from listAnimationPresets, retargeted onto the model.TheAnymodelrigneedstypeacanhumanoid_templatetakeorone;humanoid_template_handswhenrig.the preset cannot be retargeted onto the model, the call returns an error. At most one of animation_url, preset_id and ⟨101 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Preview directional sprites"}before
—after
Remove backgroundbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Remove background"}before
—after
Rig 3D model⟨83 unchanged words⟩ : humanoid_template (standard 22-joint skeleton with named joints, required for animating from the preset library) 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 ⟨79 unchanged words⟩
⟨117 unchanged words⟩ "rig_type":{"description":"Which skeleton tobuild. Pickbuild:humanoid_templategeneral (or humanoid_template_hands) if you intend to use animate3DModelPreset later - thedefaultgeneral rig cannot take presets. general,(any asset), humanoid (anime-style characters), game ⟨3 unchanged words⟩ or the pinned humanoid templates with named jointsrequired for the animation preset library- humanoid_template (22 joints) / humanoid_template_hands (52, five fingers per hand). Templates only suit two-armed, two-legged characters. Animation presets (animate3DModelPreset) retarget onto any rig type, though not onto every model. Default: \"general\".","enum":[ ⟨17 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Rig 3D model"}before
—after
Rotate sprite to a new viewbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Rotate sprite to a new view"}before
—after
Rotate spritesheet to a new viewbefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Rotate spritesheet to a new view"}before
—after
Search Ludo docsbefore
—after
{"readOnlyHint":true,"title":"Search Ludo docs"}before
—after
Send feedback to Ludobefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Send feedback to Ludo"}before
—after
Transfer motion onto spritebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Transfer motion onto sprite"}before
—after
Upscale imagebefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Upscale image"}before
—after
Upscale videobefore
—after
{"destructiveHint":false,"idempotentHint":false,"readOnlyHint":false,"title":"Upscale video"}before
—after
Validate API keybefore
—after
{"readOnlyHint":true,"title":"Validate API key"}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; needs a humanoid_template or humanoid_template_hands rig) or `model_animation` (the name of an animation the GLB itself carries). With no animation each sheet is a single frame. `directions`…
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 o…
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 b…
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 fo…
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…
⟨5 unchanged words⟩ a named built-in preset voice, with optionalemotionlanguage andlanguageeithersettings.an emotion or a delivery note, depending on the voice. Both text and voice_preset_id are required and the text is limited to1000250characters;characters.invalidThe 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 ⟨124 unchanged words⟩
⟨7 unchanged words⟩ using a voice preset","properties":{"delivery":{"description":"How the line is said, e.g. \"angry, shouting\" or \"whispering, out of breath\" (max 50 characters). Only for the first-name voices (e.g. \"Rachel\"); a descriptive voice returns HTTP 400 - use emotion instead.","maxLength":50,"type":"string"},"emotion":{"description":"Emotion to apply to the speech. Only for the descriptive voices (e.g. \"Serious woman\"); a first-name voice returns HTTP 400 for any emotion other than Default - use delivery instead.","enum":["Default","Happy","Sad ⟨8 unchanged words⟩ string"},"language":{"description":"Languagecode forof the speech. Each voice family supports its own list of languages; \"auto\" detects it from the text.","enum":["auto","English","Afrikaans ⟨34 unchanged words⟩ ,"Thai","Turkish","Ukrainian","Vietnamese","Armenian","Assamese","Asturian","Azerbaijani","Belarusian","Bengali","Bosnian","Burmese","Cebuano","Dutch","Estonian","Galician","Georgian","Gujarati","Hausa","Icelandic","Irish","Javanese","Kannada","Kazakh","Kyrgyz","Latvian","Lingala","Lithuanian","Luxembourgish","Macedonian","Malayalam","Maltese","Maori","Marathi","Mongolian","Nepali","Occitan","Odia","Pashto","Punjabi","Serbian","Sindhi","Somali","Swahili","Tajik","Telugu","Urdu","Uzbek","Welsh","Yoruba"],"example":"auto","type":"string ⟨32 unchanged words⟩ ":"Text to convert to speech (max1000250 characters).","maxLength":1000250,"type":"string"},"voice_preset_id":{"description":"Voice preset identifier. Two families of voices: the ones named by a first name (e.g. \"Rachel\", \"Roger\") take a delivery note and no emotion; the descriptive ones (e.g. \"Serious woman\", \"Deep voice man\") take an emotion and no delivery note.","enum":["Serious woman","Wise woman", ⟨23 unchanged words⟩ boy","Friendly man","Deep voice man","Rachel","Aria","Roger","Sarah","Laura","Charlie","George","Callum","River","Liam","Charlotte","Alice","Matilda","Will","Jessica","Eric","Chris","Brian","Daniel","Lily","Bill"],"example":"Serious woman","type" ⟨10 unchanged words⟩
⟨10 unchanged words⟩ "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.Bothtext is required, plus voice_descriptionandortextimageare(anrequiredimage of the speaking character, given as a URL or base64, makes the description optional); the spoken text is limited to200100 characters or the call returns HTTP 400, ⟨118 unchanged words⟩ server instructions). Credits: This endpoint consumes12 credits per call.
⟨5 unchanged words⟩ generating a voice sample from a character description and/or a character image","properties":{"augment_prompt":{"description": ⟨55 unchanged words⟩ "example":true,"type":"boolean"},"image":{"description":"URL or base64-encoded image of the speaking character (concept art, at most 15MB). The voice is designed from it, and voice_description becomes optional.","example":"<url> OR data:image/png;base64,...","type":"string"},"request_id":{"description":"Optional client-provided identifier, ⟨27 unchanged words⟩ "Text for the voice to speak (max200100 characters).","maxLength":200100,"minLength":1,"type":"string"}, ⟨28 unchanged words⟩ deep-voiced warrior\", \"cheerful young girl\"). Required unless image is given; with an image, a few words of hints.","type":"string"}},"required":["voice_description","text"],"type":"object"}}," ⟨4 unchanged words⟩
after
{"properties":{"requestBody":{"description":"Payload for generating an animated spritesheet from a static image. Input images can either be provided in base64 or URL. If the image was generated using Ludo, ideally it should be generated using the \"sprite\", \"sprite-vfx\" or \"ui_asset\" type.","properties":{"augment_prompt":{"description":"Rewrites your prompt behind the scenes into the form the model works best with. Leave it on (the default). Turning it off does not give you more control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type":"boolean"},"crop":{"description":"Crop sprite frames to fit content. Results in smaller spritesheets but inconsistent frame sizes across different animations. Default: true.","example":true,"type":"boolean"},"duration":{"description":"Duration in seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- hydra-plus: 3, 3.5, 4, 4.5, 5\n- forge: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- blitz: 1.2, 1.5, 2, 2.5, 3, 3.5, 4\n- eagle: 1, 2, 3, 4\n- eagle-audio: 1, 2, 3, 4 Default: 3.","example":3,"format":"float","type":"number"},"final_image":{"description":"The url OR base64 of ending frame image. When provided, the animation will interpolate between the initial and final frames.","example":"<url> OR data:image/png;base64,...","type":"string"},"frame_size":{"description":"Size of the sprite in pixels, not of the frame: it sets how big the character is drawn in the exported sheet, and each frame also holds the space around the sprite, so frames come out larger than this value. It changes the export only, not how the sprite is generated. 0 is maximum resolution. -1 is AI 1.5x upscaling. -9 is True Size: frames keep the size and position of the input frame, untrimmed, so the spritesheet lines up exactly with the input image - use it (not margin_ratio_mode \"none\") whenever the output must align with your input; it works with any margin mode. Exporting larger than the input image adds no detail: do not pick a size above the input's own resolution, and 0 or -1 gain nothing on inputs under 512 px. True Size crops at the input image's edges, so anything the animation adds beyond them (an aura, a spell effect, a swung weapon) is cut off: use a fixed size or 0 for those. adjustSpritesheet re-exports a finished animation at another size for free. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -1, -9. Default: 0.","example":0,"format":"integer","type":"number"},"frames":{"description":"Maximum number of frames in the output spritesheet. Allow about one second of duration per 16 frames - above that the model may not be able to produce them all (64 frames needs a duration of at least 4). The result can have fewer frames when the duration is short or bad frames were removed. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36.","example":36,"format":"integer","type":"number"},"gif":{"description":"When true, generates an animated GIF from the spritesheet and returns it in gif_url. Disabled by default to reduce response time. Default: false.","example":false,"type":"boolean"},"image_type":{"description":"Type of sprite being animated. Affects generation parameters and styling. Tiling types (horizontal / vertical tiles, scrolling backgrounds, parallax layers, textures) stay seamless only on forge and forge-pixel, and only if the input image itself already wraps seamlessly on that axis; otherwise the animation shows a visible seam when tiled. Default: \"sprite\".","enum":["sprite","sprite-vfx","item-icon","ui_asset","logo","sprite-tiling-horizontal","sprite-tiling-vertical","parallax_layer","tile","texture","portrait","card-art"],"example":"sprite","type":"string"},"individual_frames":{"description":"When true, extracts each frame from the spritesheet as an individual image and returns the URLs in individual_frame_urls. Default: false.","example":false,"type":"boolean"},"initial_image":{"description":"The url OR base64 of the starting frame image to animate. This is the base sprite that will be brought to life.","example":"<url> OR data:image/png;base64,...","type":"string"},"loop":{"description":"Trim the animation at the beginning or end to create a seamless loop. Not guaranteed to produce a perfect loop. Default: true.","example":true,"type":"boolean"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends sideways (sword slashes, punches) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"margin_ratio_mode":{"description":"How the sprite is framed for generation. The model always generates on a canvas of the same size, so any margin is canvas the sprite does not fill: the more margin, the lower the resolution and detail of the sprite. \"auto\" (default, recommended) trims and centers the sprite and picks a margin suited to the motion. \"manual\" uses margin_ratio_horizontal / margin_ratio_vertical; keep them as tight as the motion allows (about 0.15) and raise only the axis the motion needs. \"none\" animates the input exactly as framed, with no trimming and no margin added, so the input must already have suitable margins: a sprite touching the edges gets its limbs, weapons and effects cut off as soon as it moves, and an image that is mostly empty space yields a small, low-detail sprite. \"none\" is the way to keep a deliberately off-center sprite (e.g. a character at the left edge firing a beam to the right), but results can be unpredictable. Do not use \"none\" to make the spritesheet line up with the input image - use frame_size -9 (True Size) for that; it works with any margin mode. Rules: omit margin_ratio_mode and send margin_ratio_horizontal / margin_ratio_vertical to get \"manual\" automatically; \"manual\" with no margin value fails with HTTP 400; \"auto\" or \"none\" sent together with a margin value fails with HTTP 400 (the value would be ignored). Default: \"auto\".","enum":["auto","manual","none"],"example":"auto","type":"string"},"margin_ratio_vertical":{"description":"Vertical padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends up or down (jumps) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"model":{"description":"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, shortest duration 3s, so 9 credits minimum · Most capable all-around model, generates audio\n- \"hydra-plus\" (Hydra+): 4 credits/s, shortest duration 3s, so 12 credits minimum · Hydra but with better fine details. Slower generations\n- \"forge\" (Forge): 1.5 credits/s · Sharper detail, simpler motion. Best for simple body shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s · Best for low-res pixel art animations\n- \"blitz\" (Blitz): 1.9 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\n- \"eagle\" (Eagle): 2.6 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\n- \"eagle-audio\" (Eagle with Audio): 3.1 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\nLegacy aliases: \"standard\" → blitz.\nModels marked LEGACY still work for existing integrations but will be removed; pick a current model for anything new.\nforge-pixel expects real pixel art - a perfect pixel grid at its natural resolution; for other art use hydra or forge. Tiling image types stay seamless only on forge and forge-pixel. Default: \"hydra\".","enum":["hydra","hydra-plus","forge","forge-pixel","blitz","standard","eagle","eagle-audio"],"example":"hydra","type":"string"},"motion_prompt":{"description":"Text description of the desired animation, e.g. \"walking\", \"idle breathing\", \"attack slash\", \"casting a fireball with both hands\". Describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them. Do not over-describe, though: too much detail can harm the animation, and an action the model already knows should be named, not decomposed into its steps (\"walking\", never \"move the left foot forward, then the right foot\"). Do not restate what initial_image already shows (the character, its appearance and equipment, the art style, the background, the lighting, the camera), and leave frame count and timing to the frames and duration fields. Negative phrasing (\"no background\", \"do not move the camera\", \"without a weapon\") works only on hydra and hydra-plus. On forge, forge-pixel and the legacy models it backfires: naming something you do not want makes it more likely to appear, so \"without a weapon\" tends to produce a weapon. On those models never phrase anything negatively; state only what should happen, and control everything else through the image and the other fields. Keep it well under 100 words: in longer prompts details start competing and some get dropped.","type":"string"},"request_id":{"description":"Optional client-provided identifier, unique per request. Re-sending the same request_id returns the existing job instead of generating again. Also usable as the request_id filter of listGenerations.","type":"string"},"spritesheet_with_background":{"description":"When true, also returns the spritesheet with background intact (before background removal). Useful for manually fixing background removal issues. The with-background spritesheet URL will be in spritesheet_with_background_url. Default: false.","example":false,"type":"boolean"}},"required":["motion_prompt","initial_image"],"type":"object"}},"required":["requestBody"],"type":"object"}⟨72 unchanged words⟩ 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 ⟨40 unchanged words⟩ optional GIF and frame URLs, `audio_url` on hydra and hydra-plus). Credits are held for the duration you ⟨116 unchanged words⟩ Hydra 3/s (shortest duration 3s, so 9 credits minimum), Hydra+ 4/s (shortest duration 3s, so 12 credits minimum), Forge 1.5/s, Forge Pixel ⟨11 unchanged words⟩
before
{"properties":{"requestBody":{"description":"Payload for generating an animated spritesheet that interpolates through up to three fixed keyframes (initial / middle / final). Runs on hydra (default), forge or forge-pixel - the models supporting a middle keyframe. Input images can be provided in base64 or URL. At least one of initial_image or middle_image must be provided.","properties":{"augment_prompt":{"description":"Rewrites your prompt behind the scenes into the form the model works best with. Leave it on (the default). Turning it off does not give you more control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type":"boolean"},"crop":{"description":"Crop sprite frames to fit content. Results in smaller spritesheets but inconsistent frame sizes across different animations. Default: true.","example":true,"type":"boolean"},"duration":{"description":"Duration in seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- forge: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 Default: 3.","example":3,"format":"float","type":"number"},"final_image":{"description":"The url OR base64 of the final keyframe. Requires an initial_image or middle_image to anchor the animation.","example":"<url> OR data:image/png;base64,...","type":"string"},"frame_size":{"description":"Size of the sprite in pixels, not of the frame: it sets how big the character is drawn in the exported sheet, and each frame also holds the space around the sprite, so frames come out larger than this value. It changes the export only, not how the sprite is generated. 0 is maximum resolution. -1 is AI 1.5x upscaling. -9 is True Size: frames keep the size and position of the input frame, untrimmed, so the spritesheet lines up exactly with the input image - use it (not margin_ratio_mode \"none\") whenever the output must align with your input; it works with any margin mode. Exporting larger than the input image adds no detail: do not pick a size above the input's own resolution, and 0 or -1 gain nothing on inputs under 512 px. True Size crops at the input image's edges, so anything the animation adds beyond them (an aura, a spell effect, a swung weapon) is cut off: use a fixed size or 0 for those. adjustSpritesheet re-exports a finished animation at another size for free. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -1, -9. Default: 0.","example":0,"format":"integer","type":"number"},"frames":{"description":"Maximum number of frames in the output spritesheet. Allow about one second of duration per 16 frames - above that the model may not be able to produce them all (64 frames needs a duration of at least 4). The result can have fewer frames when the duration is short or bad frames were removed. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36.","example":36,"format":"integer","type":"number"},"gif":{"description":"When true, generates an animated GIF from the spritesheet and returns it in gif_url. Disabled by default to reduce response time. Default: false.","example":false,"type":"boolean"},"image_type":{"description":"Type of sprite being animated. Affects generation parameters and styling. Tiling types (horizontal / vertical tiles, scrolling backgrounds, parallax layers, textures) stay seamless only on forge and forge-pixel, and only if the input image itself already wraps seamlessly on that axis; otherwise the animation shows a visible seam when tiled. Default: \"sprite\".","enum":["sprite","sprite-vfx","item-icon","ui_asset","logo","sprite-tiling-horizontal","sprite-tiling-vertical","parallax_layer","tile","texture","portrait","card-art"],"example":"sprite","type":"string"},"individual_frames":{"description":"When true, extracts each frame from the spritesheet as an individual image and returns the URLs in individual_frame_urls. Default: false.","example":false,"type":"boolean"},"initial_image":{"description":"The url OR base64 of the first keyframe. Optional when a middle_image is provided.","example":"<url> OR data:image/png;base64,...","type":"string"},"loop":{"description":"Trim the animation at the beginning or end to create a seamless loop. Not guaranteed to produce a perfect loop. Default: true.","example":true,"type":"boolean"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends sideways (sword slashes, punches) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"margin_ratio_mode":{"description":"How the sprite is framed for generation. The model always generates on a canvas of the same size, so any margin is canvas the sprite does not fill: the more margin, the lower the resolution and detail of the sprite. \"auto\" (default, recommended) trims and centers the sprite and picks a margin suited to the motion. \"manual\" uses margin_ratio_horizontal / margin_ratio_vertical; keep them as tight as the motion allows (about 0.15) and raise only the axis the motion needs. \"none\" animates the input exactly as framed, with no trimming and no margin added, so the input must already have suitable margins: a sprite touching the edges gets its limbs, weapons and effects cut off as soon as it moves, and an image that is mostly empty space yields a small, low-detail sprite. \"none\" is the way to keep a deliberately off-center sprite (e.g. a character at the left edge firing a beam to the right), but results can be unpredictable. Do not use \"none\" to make the spritesheet line up with the input image - use frame_size -9 (True Size) for that; it works with any margin mode. Rules: omit margin_ratio_mode and send margin_ratio_horizontal / margin_ratio_vertical to get \"manual\" automatically; \"manual\" with no margin value fails with HTTP 400; \"auto\" or \"none\" sent together with a margin value fails with HTTP 400 (the value would be ignored). Default: \"auto\".","enum":["auto","manual","none"],"example":"auto","type":"string"},"margin_ratio_vertical":{"description":"Vertical padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends up or down (jumps) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"middle_image":{"description":"The url OR base64 of the middle keyframe the animation passes through between the initial and final frames. Consecutive keyframes must differ - two identical keyframes in a row produce no motion across that span.","example":"<url> OR data:image/png;base64,...","type":"string"},"model":{"description":"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, shortest duration 3s, so 9 credits minimum · Most capable all-around model, generates audio\n- \"forge\" (Forge): 1.5 credits/s · Sharper detail, simpler motion. Best for simple body shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s · Best for low-res pixel art animations\nforge-pixel expects real pixel art - a perfect pixel grid at its natural resolution; for other art use hydra or forge. Tiling image types stay seamless only on forge and forge-pixel. Default: \"hydra\".","enum":["hydra","forge","forge-pixel"],"example":"hydra","type":"string"},"motion_prompt":{"description":"Optional text description of the desired animation, e.g. \"walking\", \"attack slash\". When omitted, the motion is derived purely from the keyframes. When provided, describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them. Do not over-describe, though: too much detail can harm the animation, and an action the model already knows should be named, not decomposed into its steps (\"walking\", never \"move the left foot forward, then the right foot\"). Do not restate what the keyframes already show (the character, its appearance and equipment, the art style, the background, the lighting, the camera), and leave frame count and timing to the frames and duration fields. Negative phrasing (\"no background\", \"do not move the camera\", \"without a weapon\") works only on hydra. On forge and forge-pixel it backfires: naming something you do not want makes it more likely to appear, so \"without a weapon\" tends to produce a weapon. On those models never phrase anything negatively; state only what should happen, and control everything else through the keyframes and the other fields. Keep it well under 100 words: in longer prompts details start competing and some get dropped.","type":"string"},"request_id":{"description":"Optional client-provided identifier, unique per request. Re-sending the same request_id returns the existing job instead of generating again. Also usable as the request_id filter of listGenerations.","type":"string"},"spritesheet_with_background":{"description":"When true, also returns the spritesheet with background intact (before background removal). Useful for manually fixing background removal issues. The with-background spritesheet URL will be in spritesheet_with_background_url. Default: false.","example":false,"type":"boolean"}},"type":"object"}},"required":["requestBody"],"type":"object"}after
{"properties":{"requestBody":{"description":"Payload for generating an animated spritesheet that interpolates through up to three fixed keyframes (initial / middle / final). Runs on hydra (default), hydra-plus, forge or forge-pixel - the models supporting a middle keyframe. Input images can be provided in base64 or URL. At least one of initial_image or middle_image must be provided.","properties":{"augment_prompt":{"description":"Rewrites your prompt behind the scenes into the form the model works best with. Leave it on (the default). Turning it off does not give you more control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type":"boolean"},"crop":{"description":"Crop sprite frames to fit content. Results in smaller spritesheets but inconsistent frame sizes across different animations. Default: true.","example":true,"type":"boolean"},"duration":{"description":"Duration in seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- hydra-plus: 3, 3.5, 4, 4.5, 5\n- forge: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 Default: 3.","example":3,"format":"float","type":"number"},"final_image":{"description":"The url OR base64 of the final keyframe. Requires an initial_image or middle_image to anchor the animation.","example":"<url> OR data:image/png;base64,...","type":"string"},"frame_size":{"description":"Size of the sprite in pixels, not of the frame: it sets how big the character is drawn in the exported sheet, and each frame also holds the space around the sprite, so frames come out larger than this value. It changes the export only, not how the sprite is generated. 0 is maximum resolution. -1 is AI 1.5x upscaling. -9 is True Size: frames keep the size and position of the input frame, untrimmed, so the spritesheet lines up exactly with the input image - use it (not margin_ratio_mode \"none\") whenever the output must align with your input; it works with any margin mode. Exporting larger than the input image adds no detail: do not pick a size above the input's own resolution, and 0 or -1 gain nothing on inputs under 512 px. True Size crops at the input image's edges, so anything the animation adds beyond them (an aura, a spell effect, a swung weapon) is cut off: use a fixed size or 0 for those. adjustSpritesheet re-exports a finished animation at another size for free. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -1, -9. Default: 0.","example":0,"format":"integer","type":"number"},"frames":{"description":"Maximum number of frames in the output spritesheet. Allow about one second of duration per 16 frames - above that the model may not be able to produce them all (64 frames needs a duration of at least 4). The result can have fewer frames when the duration is short or bad frames were removed. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36.","example":36,"format":"integer","type":"number"},"gif":{"description":"When true, generates an animated GIF from the spritesheet and returns it in gif_url. Disabled by default to reduce response time. Default: false.","example":false,"type":"boolean"},"image_type":{"description":"Type of sprite being animated. Affects generation parameters and styling. Tiling types (horizontal / vertical tiles, scrolling backgrounds, parallax layers, textures) stay seamless only on forge and forge-pixel, and only if the input image itself already wraps seamlessly on that axis; otherwise the animation shows a visible seam when tiled. Default: \"sprite\".","enum":["sprite","sprite-vfx","item-icon","ui_asset","logo","sprite-tiling-horizontal","sprite-tiling-vertical","parallax_layer","tile","texture","portrait","card-art"],"example":"sprite","type":"string"},"individual_frames":{"description":"When true, extracts each frame from the spritesheet as an individual image and returns the URLs in individual_frame_urls. Default: false.","example":false,"type":"boolean"},"initial_image":{"description":"The url OR base64 of the first keyframe. Optional when a middle_image is provided.","example":"<url> OR data:image/png;base64,...","type":"string"},"loop":{"description":"Trim the animation at the beginning or end to create a seamless loop. Not guaranteed to produce a perfect loop. Default: true.","example":true,"type":"boolean"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends sideways (sword slashes, punches) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"margin_ratio_mode":{"description":"How the sprite is framed for generation. The model always generates on a canvas of the same size, so any margin is canvas the sprite does not fill: the more margin, the lower the resolution and detail of the sprite. \"auto\" (default, recommended) trims and centers the sprite and picks a margin suited to the motion. \"manual\" uses margin_ratio_horizontal / margin_ratio_vertical; keep them as tight as the motion allows (about 0.15) and raise only the axis the motion needs. \"none\" animates the input exactly as framed, with no trimming and no margin added, so the input must already have suitable margins: a sprite touching the edges gets its limbs, weapons and effects cut off as soon as it moves, and an image that is mostly empty space yields a small, low-detail sprite. \"none\" is the way to keep a deliberately off-center sprite (e.g. a character at the left edge firing a beam to the right), but results can be unpredictable. Do not use \"none\" to make the spritesheet line up with the input image - use frame_size -9 (True Size) for that; it works with any margin mode. Rules: omit margin_ratio_mode and send margin_ratio_horizontal / margin_ratio_vertical to get \"manual\" automatically; \"manual\" with no margin value fails with HTTP 400; \"auto\" or \"none\" sent together with a margin value fails with HTTP 400 (the value would be ignored). Default: \"auto\".","enum":["auto","manual","none"],"example":"auto","type":"string"},"margin_ratio_vertical":{"description":"Vertical padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends up or down (jumps) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"middle_image":{"description":"The url OR base64 of the middle keyframe the animation passes through between the initial and final frames. Consecutive keyframes must differ - two identical keyframes in a row produce no motion across that span.","example":"<url> OR data:image/png;base64,...","type":"string"},"model":{"description":"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, shortest duration 3s, so 9 credits minimum · Most capable all-around model, generates audio\n- \"hydra-plus\" (Hydra+): 4 credits/s, shortest duration 3s, so 12 credits minimum · Hydra but with better fine details. Slower generations\n- \"forge\" (Forge): 1.5 credits/s · Sharper detail, simpler motion. Best for simple body shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s · Best for low-res pixel art animations\nforge-pixel expects real pixel art - a perfect pixel grid at its natural resolution; for other art use hydra or forge. Tiling image types stay seamless only on forge and forge-pixel. Default: \"hydra\".","enum":["hydra","hydra-plus","forge","forge-pixel"],"example":"hydra","type":"string"},"motion_prompt":{"description":"Optional text description of the desired animation, e.g. \"walking\", \"attack slash\". When omitted, the motion is derived purely from the keyframes. When provided, describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them. Do not over-describe, though: too much detail can harm the animation, and an action the model already knows should be named, not decomposed into its steps (\"walking\", never \"move the left foot forward, then the right foot\"). Do not restate what the keyframes already show (the character, its appearance and equipment, the art style, the background, the lighting, the camera), and leave frame count and timing to the frames and duration fields. Negative phrasing (\"no background\", \"do not move the camera\", \"without a weapon\") works only on hydra and hydra-plus. On forge and forge-pixel it backfires: naming something you do not want makes it more likely to appear, so \"without a weapon\" tends to produce a weapon. On those models never phrase anything negatively; state only what should happen, and control everything else through the keyframes and the other fields. Keep it well under 100 words: in longer prompts details start competing and some get dropped.","type":"string"},"request_id":{"description":"Optional client-provided identifier, unique per request. Re-sending the same request_id returns the existing job instead of generating again. Also usable as the request_id filter of listGenerations.","type":"string"},"spritesheet_with_background":{"description":"When true, also returns the spritesheet with background intact (before background removal). Useful for manually fixing background removal issues. The with-background spritesheet URL will be in spritesheet_with_background_url. Default: false.","example":false,"type":"boolean"}},"type":"object"}},"required":["requestBody"],"type":"object"}⟨13 unchanged words⟩ frame beyond its borders ("outpaint"),orrepair 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`, ⟨47 unchanged words⟩ "outpaint", and not accepted for "fix_loop" or "improve"; optionally add up to 5 reference `images` ⟨22 unchanged words⟩ GIF or individual frames). Credits are heldfor the duration you requestedwhen the job is accepted; the final charge is rate × seconds of video generated, never more thanfor the duration youwasrequestedheld, and the difference (or everything, if ⟨33 unchanged words⟩ are priced per model (credits/second × duration);and held for the duration you requested; "outpaint", "fix_loop" and "fix_loopimprove" run a lighter pipeline in which `model` ⟨5 unchanged words⟩ at a flat 1 credit per second of output, held for and capped at theoutputlengthdurationof(the source spritesheet'sdurationvideounless(`duration`youdoespassnotonechange their price). Outpaint decides the extra margin itself - ⟨12 unchanged words⟩ animateSprite (`spritesheet_url`, `video_url`, grid fields); new audio is generated only by prompt edits on hydra: "fix_loop",so"outpaint"aandfix"improve"ondoanothydraregeneratesheetit,comesandbacktheirwithoutresult`audio_url`.carries the source spritesheet's `audio_url` when it had one. Pass an optional `request_id` to tag the result ⟨33 unchanged words⟩ flat 1 credit per second of output, capped at the source spritesheet's video length, no minimum, model ignored; edit_mode "improve" (hydra spritesheets only): flat 1 credit per second of output, same terms; edit_mode "prompt": per model as listed ⟨23 unchanged words⟩
⟨13 unchanged words⟩ operation - prompt-driven edit (default), outpaint, loop fixing, orloopimprovefixing.(finer detail, on hydra spritesheets only).","properties":{"crop":{"description": ⟨70 unchanged words⟩ ":{"description":"Edit operation to perform. \"improve\" re-renders the animation with finer detail (the extra pass hydra-plus runs when it generates) and only takes a spritesheet generated with hydra; any other source returns HTTP 400, including an already improved spritesheet (or a loop fix or outpaint of one), which has that detail already. Default: \"prompt\".","enum":["prompt","outpaint","fix_loop","improve"],"example":"prompt","type":"string ⟨309 unchanged words⟩ \"outpaint\", not accepted for \"fix_loop\" or \"improve\". Focus it on a single change and ⟨156 unchanged words⟩
⟨168 unchanged words⟩ anything else about the motion. Runs on hydraonly.(default) or hydra-plus (finer detail). The job result is the same sprite result ⟨152 unchanged words⟩
⟨51 unchanged words⟩ hydra: 3, 3.5, 4, 4.5, 5\n- hydra-plus: 3, 3.5, 4, 4.5, 5","format":"float","maximum":5 ⟨282 unchanged words⟩ minimum · Most capable all-around model, generatesaudioaudio\n- \"hydra-plus\" (Hydra+): 4 credits/s, shortest duration 3s, so 12 credits minimum · Hydra but with better fine details. Slower generations Default: \"hydra\".","enum":["hydra","hydra-plus"],"type":"string"},"prompt": ⟨139 unchanged words⟩
⟨65 unchanged words⟩ or three-quarter view here produces a distorted model. Prop model only: hero rejects it with HTTP 400. No extra cost.","example":"<url> OR ⟨23 unchanged words⟩ ","example":"<url> OR data:image/png;base64,...","type":"string"},"model":{"description":"Model to use. Available models:\n- \"prop\" (Prop): 4 credits · Low-cost, good for everyday props and environment pieces\n- \"hero\" (Hero): 15 credits · Highly detailed, accurate 3D generation for close-up assets · front image only, no back_image. Default: \"prop\".","enum":["prop","hero"],"example":"prop","type":"string"},"request_id":{ ⟨88 unchanged words⟩
⟨33 unchanged words⟩ file, not an AI model name -thereriggingishas no model choiceon the 3D tools). The job result is a downloadable `model_url` ⟨140 unchanged words⟩
⟨120 unchanged words⟩ string"},"job_id":{"description":"The id of the job the feedback isaboutabout. Same as a one-item job_ids.","maxLength":64,"type":"string"},"job_ids":{"description":"Thewhenidsthereof the jobs the feedback isone.about (returned by each generation call; also in getApiJob and listApiJobs). Send them whenever a job is involved: every job that shows the problem, plus the one that worked if you are comparing.","items":{"maxLength":64,"type":"string"},"maxItems":10,"type":"array"},"message":{"description":"What you ⟨40 unchanged words⟩
Only numbers and dates differ: this server embeds live figures in the definition, so the text moves without the contract changing.
⟨139 unchanged words⟩ server instructions). Credits: This endpoint consumes34 credits per call.
⟨49 unchanged words⟩ Yue","Croatian","Czech","Danish","English","Filipino","Finnish","French","German"," ⟨127 unchanged words⟩
⟨37 unchanged words⟩ id, name, category, description, duration,preview_url,and- when the preset can be retargeted onto a rigged 3D model - clip_urlpreview_url), a deduplicated perspectives array, and the ⟨48 unchanged words⟩ animateSprite (text-prompt animation), or animate3DModelPreset (applya clip_url-backedany preset by id to a rigged 3D model).
⟨108 unchanged words⟩ 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 ⟨46 unchanged words⟩
⟨89 unchanged words⟩ , not a bug: do not report it. A limitation the docs already describe (check with searchDocs) is known: do not report it.","enum":["limitation","bug"," ⟨67 unchanged words⟩
⟨1094 unchanged words⟩ \"hydra\" (Hydra): 3 credits/s,minshortestchargeduration 3s, so 9 credits minimum · Most capable all-around model, generates audio\n- \"forge\" (Forge): 1.5 credits/s,min charge 4 credits· Sharper detail, simpler motion. Best for simple ⟨10 unchanged words⟩ \"forge-pixel\" (Forge Pixel): 1.5 credits/s, min charge 4 credits· Best for low-res pixel art animations\n- \ ⟨420 unchanged words⟩
⟨144 unchanged words⟩ the job is accepted; the final charge ismax(rate × seconds of video generated,the model's minimum charge),never more than for the duration you requested, ⟨88 unchanged words⟩ × seconds, per model: Hydra 3/s (minshortestchargeduration 3s, so 9 credits minimum), Forge 1.5/s(min charge 4 credits), Forge Pixel1.5/s (min charge 4 credits);1.5/s; see this endpoint's full pricing table in the API docs.
⟨1121 unchanged words⟩ \"hydra\" (Hydra): 3 credits/s,minshortestchargeduration 3s, so 9 credits minimum · Most capable all-around model, generates audio\n- \"forge\" (Forge): 1.5 credits/s,min charge 4 credits· Sharper detail, simpler motion. Best for simple ⟨10 unchanged words⟩ \"forge-pixel\" (Forge Pixel): 1.5 credits/s, min charge 4 credits· Best for low-res pixel art animations\nforge-pixel expects ⟨326 unchanged words⟩
⟨111 unchanged words⟩ the job is accepted; the final charge ismax(rate × produced seconds, the model's minimum charge), never more than for the duration you ⟨143 unchanged words⟩
⟨110 unchanged words⟩ the job is accepted; the final charge ismax(rate × produced seconds, the model's minimum charge), never more than for the duration you ⟨123 unchanged words⟩
⟨129 unchanged words⟩ the job is accepted; the final charge ismax(rate × seconds of video generated,the model's minimum charge),never more than for the duration you requested, ⟨186 unchanged words⟩ credits/s × seconds, per model: Hydra 3/s(min charge 9 credits), Forge 2/s(min charge 4 credits), Forge Pixel2/s (min charge 4 credits);2/s; see this endpoint's full pricing table in the API docs.
⟨351 unchanged words⟩ :\n- \"hydra\" (Hydra): 3 credits/s,min charge 9 credits· Most capable all-around model, generates audio\n- \"forge\" (Forge): 2 credits/s,min charge 4 credits· Sharper detail, simpler motion. Best for simple ⟨10 unchanged words⟩ \"forge-pixel\" (Forge Pixel): 2 credits/s, min charge 4 credits· Best for low-res pixel art animations Default ⟨191 unchanged words⟩
⟨97 unchanged words⟩ the job is accepted; the final charge ismax(rate × produced seconds,the model's minimum charge),never more than for the duration you requested, ⟨67 unchanged words⟩ × seconds, per model: Griffin HD 2/s(shortest duration 5s, so 10 credits minimum), Eagle 2/s [LEGACY]; [LEGACY] models ⟨22 unchanged words⟩
⟨95 unchanged words⟩ \"griffin-hd\" (Griffin HD): 2 credits/s, shortest duration 5s, so 10 credits minimum· Same as Griffin, but in 720p\n- ⟨124 unchanged words⟩
⟨229 unchanged words⟩ that length when the job is accepted,andorneverforless3thansecondsthewhenmodel'sitminimumischargeshorter (a new view is a new generation, and hydra generates at least 3 seconds, so 9 credits); the final charge is the model's rate ⟨71 unchanged words⟩
⟨332 unchanged words⟩ \"hydra\" (Hydra): 3 credits/s,minshortestchargeduration 3s, so 9 credits minimum · Most capable all-around model, generates audio ⟨148 unchanged words⟩
⟨176 unchanged words⟩ the job is accepted; the final charge ismax(rate × seconds of video generated (which follows the reference clip orpreset),preset;thelegacymodel'smodels keep their minimum charge), never more than for the ⟨136 unchanged words⟩ credits/s × seconds, per model: Hydra 3/s(min charge 9 credits), Forge 2/s(min charge 4 credits), Forge Pixel 2/s(min charge 4 credits), Tango 4/s (min charge 4 credits) ⟨26 unchanged words⟩
⟨708 unchanged words⟩ :\n- \"hydra\" (Hydra): 3 credits/s,min charge 9 credits· Most capable all-around model, generates audio\n- \"forge\" (Forge): 2 credits/s,min charge 4 credits· Sharper detail, simpler motion. Best for simple ⟨10 unchanged words⟩ \"forge-pixel\" (Forge Pixel): 2 credits/s, min charge 4 credits· Best for low-res pixel art animations\n- \ ⟨368 unchanged words⟩
⟨669 unchanged words⟩ "example":true,"type":"boolean"},"margin_ratio":{"deprecated":true,"description":"Deprecated: prefermargin_ratio_horizontal/ margin_ratio_vertical. Amount of padding around the sprite as a ratio (0.0 to 1.0). Sets both axes to this value. A per-axis value, when also given, overrides this for that axis. Supplying any margin value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite ⟨53 unchanged words⟩ margin_ratio_mode \"manual\" unless margin_ratio_mode is setexplicitly; overrides the legacy margin_ratio on this axis.explicitly.","format":"float","type":"number ⟨311 unchanged words⟩ margin_ratio_mode \"manual\" unless margin_ratio_mode is setexplicitly; overrides the legacy margin_ratio on this axis.explicitly.","format":"float","type":"number ⟨440 unchanged words⟩
⟨437 unchanged words⟩ "example":true,"type":"boolean"},"margin_ratio":{"deprecated":true,"description":"Deprecated: prefermargin_ratio_horizontal/ margin_ratio_vertical. Amount of padding around the sprite as a ratio (0.0 to 1.0). Sets both axes to this value. A per-axis value, when also given, overrides this for that axis. Defaults to 0.15 when no margin value is given at all.","format":"float","type":"number"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite ⟨41 unchanged words⟩ punches) or if the sprite gets cut off.Overrides the legacy margin_ratio on this axis.","format":"float","type":"number ⟨188 unchanged words⟩ jumps) or if the sprite gets cut off.Overrides the legacy margin_ratio on this axis.","format":"float","type":"number ⟨437 unchanged words⟩
⟨226 unchanged words⟩ },"frame_size":{"description":"Size ofeachtheframesprite in pixels,(widthnotandofheight).theItframe:sizesit sets how big the character is drawn in the exported sheet, and each frame also holds the space around the sprite, so framesonlycome-outitlargerdoesthannotthischangevalue. It changes the export only, not how the sprite is generated. 0 is maximum ⟨1363 unchanged words⟩
⟨216 unchanged words⟩ },"frame_size":{"description":"Size ofeachtheframesprite in pixels,(widthnotandofheight).theItframe:sizesit sets how big the character is drawn in the exported sheet, and each frame also holds the space around the sprite, so framesonlycome-outitlargerdoesthannotthischangevalue. It changes the export only, not how the sprite is generated. 0 is maximum ⟨1306 unchanged words⟩
⟨112 unchanged words⟩ },"frame_size":{"description":"Size ofeachtheframesprite in pixels,(widthnot of the frame - it sets how big the character is drawn, andheight).each frame also holds the space around it, so frames come out larger than this value. 0 is for maximum resolution. Omit to keep the source spritesheet'sframe size.setting. Accepted values: 32, 64, 96, 128 ⟨436 unchanged words⟩
⟨87 unchanged words⟩ },"frame_size":{"description":"Size ofeachtheframesprite in pixels,(widthnot of the frame - it sets how big the character is drawn, andheight).each frame also holds the space around it, so frames come out larger than this value. 0 is for maximum resolution. Omit to keep the source spritesheet'sframe size.setting. Accepted values: 32, 64, 96, 128 ⟨353 unchanged words⟩
⟨139 unchanged words⟩ },"frame_size":{"description":"Size ofeachtheframesprite in pixels,(widthnot of the frame: it sets how big the character is drawn in the exported sheet, andheight).each frame also holds the space around the sprite, so frames come out larger than this value. 0 is maximum resolution. Exporting larger than the ⟨1017 unchanged words⟩
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…
before
{"properties":{"requestBody":{"description":"Payload for generating an animated spritesheet from a static image. Input images can either be provided in base64 or URL. If the image was generated using Ludo, ideally it should be generated using the \"sprite\", \"sprite-vfx\" or \"ui_asset\" type.","properties":{"augment_prompt":{"description":"Augment the prompt behind the scenes. Disable to have more control. Incompatible with automatic framing: false requires margin_ratio_mode \"manual\" (with margin_ratio_horizontal and/or margin_ratio_vertical) or \"none\". Because margin_ratio_mode defaults to \"auto\", sending augment_prompt false on its own fails with HTTP 400. Default: true.","example":true,"type":"boolean"},"crop":{"description":"Crop sprite frames to fit content. Results in smaller spritesheets but inconsistent frame sizes across different animations. Default: true.","example":true,"type":"boolean"},"duration":{"description":"Duration in seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- forge: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- blitz: 1.2, 1.5, 2, 2.5, 3, 3.5, 4\n- eagle: 1, 2, 3, 4\n- eagle-audio: 1, 2, 3, 4 Default: 3.","example":3,"format":"float","type":"number"},"final_image":{"description":"The url OR base64 of ending frame image. When provided, the animation will interpolate between the initial and final frames.","example":"<url> OR data:image/png;base64,...","type":"string"},"frame_size":{"description":"Size of each frame in pixels (width and height). 0 is for maximum resolution. -1 is for AI 1.5x upscaling. -9 is for matching the size and position of the input frame. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -1, -9. Default: 0.","example":0,"format":"integer","type":"number"},"frames":{"description":"Number of frames in the output spritesheet. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36.","example":36,"format":"integer","type":"number"},"gif":{"description":"When true, generates an animated GIF from the spritesheet and returns it in gif_url. Disabled by default to reduce response time. Default: false.","example":false,"type":"boolean"},"image_type":{"description":"Type of sprite being animated. Affects generation parameters and styling. Default: \"sprite\".","enum":["sprite","sprite-vfx","item-icon","ui_asset","logo","sprite-tiling-horizontal","sprite-tiling-vertical","parallax_layer","tile","texture","portrait","card-art"],"example":"sprite","type":"string"},"individual_frames":{"description":"When true, extracts each frame from the spritesheet as an individual image and returns the URLs in individual_frame_urls. Default: false.","example":false,"type":"boolean"},"initial_image":{"description":"The url OR base64 of the starting frame image to animate. This is the base sprite that will be brought to life.","example":"<url> OR data:image/png;base64,...","type":"string"},"loop":{"description":"Trim the animation at the beginning or end to create a seamless loop. Not guaranteed to produce a perfect loop. Default: true.","example":true,"type":"boolean"},"margin_ratio":{"deprecated":true,"description":"Deprecated: prefer margin_ratio_horizontal / margin_ratio_vertical. Amount of padding around the sprite as a ratio (0.0 to 1.0). Sets both axes to this value. A per-axis value, when also given, overrides this for that axis. Supplying any margin value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite as a ratio (0.0 to 1.0). Useful for animations that extend sideways (e.g., sword slashes, punches). Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly; overrides the legacy margin_ratio on this axis.","format":"float","type":"number"},"margin_ratio_mode":{"description":"Controls how margins are applied around the sprite. Omit it and send margin_ratio_horizontal / margin_ratio_vertical to get \"manual\" automatically. \"manual\" requires margin_ratio_horizontal and/or margin_ratio_vertical (or the legacy margin_ratio); sending \"manual\" with no margin value fails with HTTP 400. Sending \"auto\" or \"none\" explicitly together with a margin value fails with HTTP 400 (the value would be ignored). Default: \"auto\".","enum":["auto","manual","none"],"example":"auto","type":"string"},"margin_ratio_vertical":{"description":"Vertical padding around the sprite as a ratio (0.0 to 1.0). Useful for animations that extend up or down (e.g., jumps). Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly; overrides the legacy margin_ratio on this axis.","format":"float","type":"number"},"model":{"description":"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, min charge 9 credits · Most capable all-around model, generates audio\n- \"forge\" (Forge): 1.5 credits/s, min charge 4 credits · Sharper detail, simpler motion. Best for simple body shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s, min charge 4 credits · Best for low-res pixel art animations\n- \"blitz\" (Blitz): 1.9 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\n- \"eagle\" (Eagle): 2.6 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\n- \"eagle-audio\" (Eagle with Audio): 3.1 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\nLegacy aliases: \"standard\" → blitz.\nModels marked LEGACY still work for existing integrations but will be removed; pick a current model for anything new. Default: \"hydra\".","enum":["hydra","forge","forge-pixel","blitz","standard","eagle","eagle-audio"],"example":"hydra","type":"string"},"motion_prompt":{"description":"Text description of the desired animation, e.g. \"walking\", \"idle breathing\", \"attack slash\", \"casting a fireball with both hands\". Describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them. Do not over-describe, though: too much detail can harm the animation, and an action the model already knows should be named, not decomposed into its steps (\"walking\", never \"move the left foot forward, then the right foot\"). Do not restate what initial_image already shows (the character, its appearance and equipment, the art style, the background, the lighting, the camera), and leave frame count and timing to the frames and duration fields. Negative phrasing (\"no background\", \"do not move the camera\", \"without a weapon\") works only on hydra. On forge, forge-pixel and the legacy models it backfires: naming something you do not want makes it more likely to appear, so \"without a weapon\" tends to produce a weapon. On those models never phrase anything negatively; state only what should happen, and control everything else through the image and the other fields.","type":"string"},"request_id":{"description":"Optional client-provided identifier, unique per request. Re-sending the same request_id returns the existing job instead of generating again. Also usable as the request_id filter of listGenerations.","type":"string"},"spritesheet_with_background":{"description":"When true, also returns the spritesheet with background intact (before background removal). Useful for manually fixing background removal issues. The with-background spritesheet URL will be in spritesheet_with_background_url. Default: false.","example":false,"type":"boolean"}},"required":["motion_prompt","initial_image"],"type":"object"}},"required":["requestBody"],"type":"object"}after
{"properties":{"requestBody":{"description":"Payload for generating an animated spritesheet from a static image. Input images can either be provided in base64 or URL. If the image was generated using Ludo, ideally it should be generated using the \"sprite\", \"sprite-vfx\" or \"ui_asset\" type.","properties":{"augment_prompt":{"description":"Rewrites your prompt behind the scenes into the form the model works best with. Leave it on (the default). Turning it off does not give you more control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type":"boolean"},"crop":{"description":"Crop sprite frames to fit content. Results in smaller spritesheets but inconsistent frame sizes across different animations. Default: true.","example":true,"type":"boolean"},"duration":{"description":"Duration in seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- forge: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- blitz: 1.2, 1.5, 2, 2.5, 3, 3.5, 4\n- eagle: 1, 2, 3, 4\n- eagle-audio: 1, 2, 3, 4 Default: 3.","example":3,"format":"float","type":"number"},"final_image":{"description":"The url OR base64 of ending frame image. When provided, the animation will interpolate between the initial and final frames.","example":"<url> OR data:image/png;base64,...","type":"string"},"frame_size":{"description":"Size of each frame in pixels (width and height). It sizes the exported frames only - it does not change how the sprite is generated. 0 is maximum resolution. -1 is AI 1.5x upscaling. -9 is True Size: frames keep the size and position of the input frame, untrimmed, so the spritesheet lines up exactly with the input image - use it (not margin_ratio_mode \"none\") whenever the output must align with your input; it works with any margin mode. Exporting larger than the input image adds no detail: do not pick a size above the input's own resolution, and 0 or -1 gain nothing on inputs under 512 px. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -1, -9. Default: 0.","example":0,"format":"integer","type":"number"},"frames":{"description":"Maximum number of frames in the output spritesheet. Allow about one second of duration per 16 frames - above that the model may not be able to produce them all (64 frames needs a duration of at least 4). The result can have fewer frames when the duration is short or bad frames were removed. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36.","example":36,"format":"integer","type":"number"},"gif":{"description":"When true, generates an animated GIF from the spritesheet and returns it in gif_url. Disabled by default to reduce response time. Default: false.","example":false,"type":"boolean"},"image_type":{"description":"Type of sprite being animated. Affects generation parameters and styling. Tiling types (horizontal / vertical tiles, scrolling backgrounds, parallax layers, textures) stay seamless only on forge and forge-pixel, and only if the input image itself already wraps seamlessly on that axis; otherwise the animation shows a visible seam when tiled. Default: \"sprite\".","enum":["sprite","sprite-vfx","item-icon","ui_asset","logo","sprite-tiling-horizontal","sprite-tiling-vertical","parallax_layer","tile","texture","portrait","card-art"],"example":"sprite","type":"string"},"individual_frames":{"description":"When true, extracts each frame from the spritesheet as an individual image and returns the URLs in individual_frame_urls. Default: false.","example":false,"type":"boolean"},"initial_image":{"description":"The url OR base64 of the starting frame image to animate. This is the base sprite that will be brought to life.","example":"<url> OR data:image/png;base64,...","type":"string"},"loop":{"description":"Trim the animation at the beginning or end to create a seamless loop. Not guaranteed to produce a perfect loop. Default: true.","example":true,"type":"boolean"},"margin_ratio":{"deprecated":true,"description":"Deprecated: prefer margin_ratio_horizontal / margin_ratio_vertical. Amount of padding around the sprite as a ratio (0.0 to 1.0). Sets both axes to this value. A per-axis value, when also given, overrides this for that axis. Supplying any margin value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends sideways (sword slashes, punches) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly; overrides the legacy margin_ratio on this axis.","format":"float","type":"number"},"margin_ratio_mode":{"description":"How the sprite is framed for generation. The model always generates on a canvas of the same size, so any margin is canvas the sprite does not fill: the more margin, the lower the resolution and detail of the sprite. \"auto\" (default, recommended) trims and centers the sprite and picks a margin suited to the motion. \"manual\" uses margin_ratio_horizontal / margin_ratio_vertical; keep them as tight as the motion allows (about 0.15) and raise only the axis the motion needs. \"none\" animates the input exactly as framed, with no trimming and no margin added, so the input must already have suitable margins: a sprite touching the edges gets its limbs, weapons and effects cut off as soon as it moves, and an image that is mostly empty space yields a small, low-detail sprite. \"none\" is the way to keep a deliberately off-center sprite (e.g. a character at the left edge firing a beam to the right), but results can be unpredictable. Do not use \"none\" to make the spritesheet line up with the input image - use frame_size -9 (True Size) for that; it works with any margin mode. Rules: omit margin_ratio_mode and send margin_ratio_horizontal / margin_ratio_vertical to get \"manual\" automatically; \"manual\" with no margin value fails with HTTP 400; \"auto\" or \"none\" sent together with a margin value fails with HTTP 400 (the value would be ignored). Default: \"auto\".","enum":["auto","manual","none"],"example":"auto","type":"string"},"margin_ratio_vertical":{"description":"Vertical padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends up or down (jumps) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly; overrides the legacy margin_ratio on this axis.","format":"float","type":"number"},"model":{"description":"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, min charge 9 credits · Most capable all-around model, generates audio\n- \"forge\" (Forge): 1.5 credits/s, min charge 4 credits · Sharper detail, simpler motion. Best for simple body shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s, min charge 4 credits · Best for low-res pixel art animations\n- \"blitz\" (Blitz): 1.9 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\n- \"eagle\" (Eagle): 2.6 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\n- \"eagle-audio\" (Eagle with Audio): 3.1 credits/s, min charge 4 credits · LEGACY - scheduled for removal, do not use for new work\nLegacy aliases: \"standard\" → blitz.\nModels marked LEGACY still work for existing integrations but will be removed; pick a current model for anything new.\nforge-pixel expects real pixel art - a perfect pixel grid at its natural resolution; for other art use hydra or forge. Tiling image types stay seamless only on forge and forge-pixel. Default: \"hydra\".","enum":["hydra","forge","forge-pixel","blitz","standard","eagle","eagle-audio"],"example":"hydra","type":"string"},"motion_prompt":{"description":"Text description of the desired animation, e.g. \"walking\", \"idle breathing\", \"attack slash\", \"casting a fireball with both hands\". Describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them. Do not over-describe, though: too much detail can harm the animation, and an action the model already knows should be named, not decomposed into its steps (\"walking\", never \"move the left foot forward, then the right foot\"). Do not restate what initial_image already shows (the character, its appearance and equipment, the art style, the background, the lighting, the camera), and leave frame count and timing to the frames and duration fields. Negative phrasing (\"no background\", \"do not move the camera\", \"without a weapon\") works only on hydra. On forge, forge-pixel and the legacy models it backfires: naming something you do not want makes it more likely to appear, so \"without a weapon\" tends to produce a weapon. On those models never phrase anything negatively; state only what should happen, and control everything else through the image and the other fields. Keep it well under 100 words: in longer prompts details start competing and some get dropped.","type":"string"},"request_id":{"description":"Optional client-provided identifier, unique per request. Re-sending the same request_id returns the existing job instead of generating again. Also usable as the request_id filter of listGenerations.","type":"string"},"spritesheet_with_background":{"description":"When true, also returns the spritesheet with background intact (before background removal). Useful for manually fixing background removal issues. The with-background spritesheet URL will be in spritesheet_with_background_url. Default: false.","example":false,"type":"boolean"}},"required":["motion_prompt","initial_image"],"type":"object"}},"required":["requestBody"],"type":"object"}before
{"properties":{"requestBody":{"description":"Payload for generating an animated spritesheet that interpolates through up to three fixed keyframes (initial / middle / final). Runs on hydra (default), forge or forge-pixel - the models supporting a middle keyframe. Input images can be provided in base64 or URL. At least one of initial_image or middle_image must be provided.","properties":{"augment_prompt":{"description":"Augment the prompt behind the scenes. Disable to have more control. Incompatible with automatic framing: false requires margin_ratio_mode \"manual\" (with margin_ratio_horizontal and/or margin_ratio_vertical) or \"none\". Because margin_ratio_mode defaults to \"auto\", sending augment_prompt false on its own fails with HTTP 400. Default: true.","example":true,"type":"boolean"},"crop":{"description":"Crop sprite frames to fit content. Results in smaller spritesheets but inconsistent frame sizes across different animations. Default: true.","example":true,"type":"boolean"},"duration":{"description":"Duration in seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- forge: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 Default: 3.","example":3,"format":"float","type":"number"},"final_image":{"description":"The url OR base64 of the final keyframe. Requires an initial_image or middle_image to anchor the animation.","example":"<url> OR data:image/png;base64,...","type":"string"},"frame_size":{"description":"Size of each frame in pixels (width and height). 0 is for maximum resolution. -1 is for AI 1.5x upscaling. -9 is for matching the size and position of the input frame. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -1, -9. Default: 0.","example":0,"format":"integer","type":"number"},"frames":{"description":"Number of frames in the output spritesheet. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36.","example":36,"format":"integer","type":"number"},"gif":{"description":"When true, generates an animated GIF from the spritesheet and returns it in gif_url. Disabled by default to reduce response time. Default: false.","example":false,"type":"boolean"},"image_type":{"description":"Type of sprite being animated. Affects generation parameters and styling. Default: \"sprite\".","enum":["sprite","sprite-vfx","item-icon","ui_asset","logo","sprite-tiling-horizontal","sprite-tiling-vertical","parallax_layer","tile","texture","portrait","card-art"],"example":"sprite","type":"string"},"individual_frames":{"description":"When true, extracts each frame from the spritesheet as an individual image and returns the URLs in individual_frame_urls. Default: false.","example":false,"type":"boolean"},"initial_image":{"description":"The url OR base64 of the first keyframe. Optional when a middle_image is provided.","example":"<url> OR data:image/png;base64,...","type":"string"},"loop":{"description":"Trim the animation at the beginning or end to create a seamless loop. Not guaranteed to produce a perfect loop. Default: true.","example":true,"type":"boolean"},"margin_ratio":{"deprecated":true,"description":"Deprecated: prefer margin_ratio_horizontal / margin_ratio_vertical. Amount of padding around the sprite as a ratio (0.0 to 1.0). Sets both axes to this value. A per-axis value, when also given, overrides this for that axis. Supplying any margin value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite as a ratio (0.0 to 1.0). Useful for animations that extend sideways (e.g., sword slashes, punches). Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly; overrides the legacy margin_ratio on this axis.","format":"float","type":"number"},"margin_ratio_mode":{"description":"Controls how margins are applied around the sprite. Omit it and send margin_ratio_horizontal / margin_ratio_vertical to get \"manual\" automatically. \"manual\" requires margin_ratio_horizontal and/or margin_ratio_vertical (or the legacy margin_ratio); sending \"manual\" with no margin value fails with HTTP 400. Sending \"auto\" or \"none\" explicitly together with a margin value fails with HTTP 400 (the value would be ignored). Default: \"auto\".","enum":["auto","manual","none"],"example":"auto","type":"string"},"margin_ratio_vertical":{"description":"Vertical padding around the sprite as a ratio (0.0 to 1.0). Useful for animations that extend up or down (e.g., jumps). Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly; overrides the legacy margin_ratio on this axis.","format":"float","type":"number"},"middle_image":{"description":"The url OR base64 of the middle keyframe the animation passes through between the initial and final frames.","example":"<url> OR data:image/png;base64,...","type":"string"},"model":{"description":"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, min charge 9 credits · Most capable all-around model, generates audio\n- \"forge\" (Forge): 1.5 credits/s, min charge 4 credits · Sharper detail, simpler motion. Best for simple body shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s, min charge 4 credits · Best for low-res pixel art animations Default: \"hydra\".","enum":["hydra","forge","forge-pixel"],"example":"hydra","type":"string"},"motion_prompt":{"description":"Optional text description of the desired animation, e.g. \"walking\", \"attack slash\". When omitted, the motion is derived purely from the keyframes. When provided, describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them. Do not over-describe, though: too much detail can harm the animation, and an action the model already knows should be named, not decomposed into its steps (\"walking\", never \"move the left foot forward, then the right foot\"). Do not restate what the keyframes already show (the character, its appearance and equipment, the art style, the background, the lighting, the camera), and leave frame count and timing to the frames and duration fields. Negative phrasing (\"no background\", \"do not move the camera\", \"without a weapon\") works only on hydra. On forge and forge-pixel it backfires: naming something you do not want makes it more likely to appear, so \"without a weapon\" tends to produce a weapon. On those models never phrase anything negatively; state only what should happen, and control everything else through the keyframes and the other fields.","type":"string"},"request_id":{"description":"Optional client-provided identifier, unique per request. Re-sending the same request_id returns the existing job instead of generating again. Also usable as the request_id filter of listGenerations.","type":"string"},"spritesheet_with_background":{"description":"When true, also returns the spritesheet with background intact (before background removal). Useful for manually fixing background removal issues. The with-background spritesheet URL will be in spritesheet_with_background_url. Default: false.","example":false,"type":"boolean"}},"type":"object"}},"required":["requestBody"],"type":"object"}after
{"properties":{"requestBody":{"description":"Payload for generating an animated spritesheet that interpolates through up to three fixed keyframes (initial / middle / final). Runs on hydra (default), forge or forge-pixel - the models supporting a middle keyframe. Input images can be provided in base64 or URL. At least one of initial_image or middle_image must be provided.","properties":{"augment_prompt":{"description":"Rewrites your prompt behind the scenes into the form the model works best with. Leave it on (the default). Turning it off does not give you more control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type":"boolean"},"crop":{"description":"Crop sprite frames to fit content. Results in smaller spritesheets but inconsistent frame sizes across different animations. Default: true.","example":true,"type":"boolean"},"duration":{"description":"Duration in seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- forge: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 Default: 3.","example":3,"format":"float","type":"number"},"final_image":{"description":"The url OR base64 of the final keyframe. Requires an initial_image or middle_image to anchor the animation.","example":"<url> OR data:image/png;base64,...","type":"string"},"frame_size":{"description":"Size of each frame in pixels (width and height). It sizes the exported frames only - it does not change how the sprite is generated. 0 is maximum resolution. -1 is AI 1.5x upscaling. -9 is True Size: frames keep the size and position of the input frame, untrimmed, so the spritesheet lines up exactly with the input image - use it (not margin_ratio_mode \"none\") whenever the output must align with your input; it works with any margin mode. Exporting larger than the input image adds no detail: do not pick a size above the input's own resolution, and 0 or -1 gain nothing on inputs under 512 px. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -1, -9. Default: 0.","example":0,"format":"integer","type":"number"},"frames":{"description":"Maximum number of frames in the output spritesheet. Allow about one second of duration per 16 frames - above that the model may not be able to produce them all (64 frames needs a duration of at least 4). The result can have fewer frames when the duration is short or bad frames were removed. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36.","example":36,"format":"integer","type":"number"},"gif":{"description":"When true, generates an animated GIF from the spritesheet and returns it in gif_url. Disabled by default to reduce response time. Default: false.","example":false,"type":"boolean"},"image_type":{"description":"Type of sprite being animated. Affects generation parameters and styling. Tiling types (horizontal / vertical tiles, scrolling backgrounds, parallax layers, textures) stay seamless only on forge and forge-pixel, and only if the input image itself already wraps seamlessly on that axis; otherwise the animation shows a visible seam when tiled. Default: \"sprite\".","enum":["sprite","sprite-vfx","item-icon","ui_asset","logo","sprite-tiling-horizontal","sprite-tiling-vertical","parallax_layer","tile","texture","portrait","card-art"],"example":"sprite","type":"string"},"individual_frames":{"description":"When true, extracts each frame from the spritesheet as an individual image and returns the URLs in individual_frame_urls. Default: false.","example":false,"type":"boolean"},"initial_image":{"description":"The url OR base64 of the first keyframe. Optional when a middle_image is provided.","example":"<url> OR data:image/png;base64,...","type":"string"},"loop":{"description":"Trim the animation at the beginning or end to create a seamless loop. Not guaranteed to produce a perfect loop. Default: true.","example":true,"type":"boolean"},"margin_ratio":{"deprecated":true,"description":"Deprecated: prefer margin_ratio_horizontal / margin_ratio_vertical. Amount of padding around the sprite as a ratio (0.0 to 1.0). Sets both axes to this value. A per-axis value, when also given, overrides this for that axis. Supplying any margin value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly.","format":"float","type":"number"},"margin_ratio_horizontal":{"description":"Horizontal padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends sideways (sword slashes, punches) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly; overrides the legacy margin_ratio on this axis.","format":"float","type":"number"},"margin_ratio_mode":{"description":"How the sprite is framed for generation. The model always generates on a canvas of the same size, so any margin is canvas the sprite does not fill: the more margin, the lower the resolution and detail of the sprite. \"auto\" (default, recommended) trims and centers the sprite and picks a margin suited to the motion. \"manual\" uses margin_ratio_horizontal / margin_ratio_vertical; keep them as tight as the motion allows (about 0.15) and raise only the axis the motion needs. \"none\" animates the input exactly as framed, with no trimming and no margin added, so the input must already have suitable margins: a sprite touching the edges gets its limbs, weapons and effects cut off as soon as it moves, and an image that is mostly empty space yields a small, low-detail sprite. \"none\" is the way to keep a deliberately off-center sprite (e.g. a character at the left edge firing a beam to the right), but results can be unpredictable. Do not use \"none\" to make the spritesheet line up with the input image - use frame_size -9 (True Size) for that; it works with any margin mode. Rules: omit margin_ratio_mode and send margin_ratio_horizontal / margin_ratio_vertical to get \"manual\" automatically; \"manual\" with no margin value fails with HTTP 400; \"auto\" or \"none\" sent together with a margin value fails with HTTP 400 (the value would be ignored). Default: \"auto\".","enum":["auto","manual","none"],"example":"auto","type":"string"},"margin_ratio_vertical":{"description":"Vertical padding around the sprite as a ratio (0.0 to 1.0). Every bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only for motion that extends up or down (jumps) or if the sprite gets cut off. Supplying a value selects margin_ratio_mode \"manual\" unless margin_ratio_mode is set explicitly; overrides the legacy margin_ratio on this axis.","format":"float","type":"number"},"middle_image":{"description":"The url OR base64 of the middle keyframe the animation passes through between the initial and final frames. Consecutive keyframes must differ - two identical keyframes in a row produce no motion across that span.","example":"<url> OR data:image/png;base64,...","type":"string"},"model":{"description":"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, min charge 9 credits · Most capable all-around model, generates audio\n- \"forge\" (Forge): 1.5 credits/s, min charge 4 credits · Sharper detail, simpler motion. Best for simple body shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s, min charge 4 credits · Best for low-res pixel art animations\nforge-pixel expects real pixel art - a perfect pixel grid at its natural resolution; for other art use hydra or forge. Tiling image types stay seamless only on forge and forge-pixel. Default: \"hydra\".","enum":["hydra","forge","forge-pixel"],"example":"hydra","type":"string"},"motion_prompt":{"description":"Optional text description of the desired animation, e.g. \"walking\", \"attack slash\". When omitted, the motion is derived purely from the keyframes. When provided, describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them. Do not over-describe, though: too much detail can harm the animation, and an action the model already knows should be named, not decomposed into its steps (\"walking\", never \"move the left foot forward, then the right foot\"). Do not restate what the keyframes already show (the character, its appearance and equipment, the art style, the background, the lighting, the camera), and leave frame count and timing to the frames and duration fields. Negative phrasing (\"no background\", \"do not move the camera\", \"without a weapon\") works only on hydra. On forge and forge-pixel it backfires: naming something you do not want makes it more likely to appear, so \"without a weapon\" tends to produce a weapon. On those models never phrase anything negatively; state only what should happen, and control everything else through the keyframes and the other fields. Keep it well under 100 words: in longer prompts details start competing and some get dropped.","type":"string"},"request_id":{"description":"Optional client-provided identifier, unique per request. Re-sending the same request_id returns the existing job instead of generating again. Also usable as the request_id filter of listGenerations.","type":"string"},"spritesheet_with_background":{"description":"When true, also returns the spritesheet with background intact (before background removal). Useful for manually fixing background removal issues. The with-background spritesheet URL will be in spritesheet_with_background_url. Default: false.","example":false,"type":"boolean"}},"type":"object"}},"required":["requestBody"],"type":"object"}⟨15 unchanged words⟩ ,"properties":{"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨101 unchanged words⟩
⟨22 unchanged words⟩ ,"properties":{"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨162 unchanged words⟩
⟨104 unchanged words⟩ :"string"},"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨154 unchanged words⟩
⟨11 unchanged words⟩ ,"properties":{"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨114 unchanged words⟩
⟨13 unchanged words⟩ ,"properties":{"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨102 unchanged words⟩
⟨15 unchanged words⟩ ,"properties":{"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨350 unchanged words⟩
⟨13 unchanged words⟩ ,"properties":{"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨95 unchanged words⟩
⟨13 unchanged words⟩ ,"properties":{"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨225 unchanged words⟩
⟨160 unchanged words⟩ Omit to keep the source spritesheet's frame count. Allow about one second of duration per 16 frames - above that the model may not be able to produce them all. Accepted values: 4, 9, 16, 25, ⟨45 unchanged words⟩ a URL or base64, to guide the edit. Two, at most three, work best: more references reduce the model's ability to use any of them correctly.","items":{"type":"string"}, ⟨139 unchanged words⟩ "outpaint\", not accepted for \"fix_loop\". Focus it on a single change and keep it short (under about 50 words); run a second edit for more.","type":"string"},"request_id":{ ⟨50 unchanged words⟩ as spritesheet_url). External URLs are not accepted. Edit the original animation rather than a previous edit's result: every edit re-renders the whole animation, so colors and detail drift further with each pass. If an edit did not work, retry from the original instead of editing on top.","example":"<url>","type":"string ⟨37 unchanged words⟩
⟨13 unchanged words⟩ ,"properties":{"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨181 unchanged words⟩
⟨17 unchanged words⟩ ,"properties":{"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨145 unchanged words⟩
⟨13 unchanged words⟩ ,"properties":{"augment_prompt":{"description":"AugmentRewritestheyour prompt behind thescenes.scenesDisableintotothehaveform the model works best with. Leave it on (the default). Turning it off does not give you morecontrol.control - it usually gives worse results. Do not disable it unless you really know what you are doing and have tested your prompts extensively. Default: true.","example":true,"type" ⟨158 unchanged words⟩
⟨146 unchanged words⟩ pixels (width and height). 0 isformaximum resolution. Exporting larger than the input image adds no detail: do not pick a size above the input's own resolution, and 0 gains nothing on inputs under 512 px. True Size is not available here: the image is not the first frame of the result, so there is nothing to align to. Accepted values: 32, 64, 96, 128, ⟨11 unchanged words⟩ :"number"},"frames":{"description":"NumberMaximum number of frames in the output spritesheet. Allow about one second of duration per 16 frames - above that the model may not be able to produce them all (64 frames needs a duration of at least 4). The result can have fewer frames when the duration is short or bad frames were removed. Accepted values: 4, 9, 16, 25, ⟨184 unchanged words⟩ as a ratio (0.0 to 1.0).UsefulEvery bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only foranimationsmotion thatextendextends sideways (e.g.,sword slashes, punches).or if the sprite gets cut off. Overrides the legacy margin_ratio on this axis."," ⟨3 unchanged words⟩ :"number"},"margin_ratio_mode":{"description":"Controls howHowmarginsthearespriteappliedisaroundframedtheforsprite.generation. Defaults to \"manual\" (0.15 on each axis when no margin value is given); transfer motion has no \"auto\".SendingThe model always generates on a canvas of the same size, so any margin is canvas the sprite does not fill: the more margin, the lower the resolution and detail of the sprite. Keep the margins tight - about 0.15 - and raise only the axis the motion needs. \"none\"explicitlyanimates the image exactly as framed, so it must already have suitable margins (not touching the edges, not mostly empty space); an off-center sprite can give unpredictable results. Sending \"none\" together with a margin value fails with HTTP ⟨25 unchanged words⟩ as a ratio (0.0 to 1.0).UsefulEvery bit of margin is resolution taken from the sprite, so keep it as tight as the motion allows - about 0.15 - and go higher only foranimationsmotion thatextendextends up or down (e.g.,jumps).or if the sprite gets cut off. Overrides the legacy margin_ratio on this axis."," ⟨102 unchanged words⟩ be removed; pick a current model for anythingnew.new.\nforge is tuned for the motion presets (preset_id) and often fails to follow your own video - use hydra for custom footage. forge-pixel expects real pixel art - a perfect pixel grid at its natural resolution. Default: \"hydra\".","enum":[" ⟨244 unchanged words⟩ when both are sent the video is used. A video more than twice as long as `duration` gets heavily compressed and the motion turns rushed - trim it to the part you want, or raise `duration`.","type":"string"}},"required": ⟨7 unchanged words⟩
⟨259 unchanged words⟩ × seconds, per model: Hydra 3/s (shortest duration 3s,minsocharge 9 creditsminimum), Forge 1.5/s (min charge 4 credits) ⟨18 unchanged words⟩
⟨694 unchanged words⟩ \"hydra\" (Hydra): 3 credits/s,shortest duration 3s,minsocharge 9 creditsminimum· Most capable all-around model, generates audio\n- ⟨325 unchanged words⟩
⟨46 unchanged words⟩ :image/png;base64,...","type":"string"},"image_type":{"description":"What kind of image the source is (e.g. \"sprite\"). Not needed when `image` is the URL of an image you generated on Ludo in the last 30 days, which keeps its own type. Set it when you pass base64 or an external URL, so a sprite is edited as a sprite and keeps its transparent background.","enum":["generic","screenshot","art","asset","sprite","sprite-vfx","sprite-tiling-horizontal","sprite-tiling-vertical","icon","logo","ui_asset","fixed_background","side_scrolling_background","vertical_scrolling_background","parallax_layer","texture","tile","item-icon","portrait","card-art","splash","3d"],"example":"sprite","type":"string"},"n":{"description":"Number of edited variations ⟨111 unchanged words⟩
⟨343 unchanged words⟩ × seconds, per model: Hydra 3/s (shortest duration 3s,minsocharge 9 creditsminimum), Forge 2/s (min charge 4 credits) ⟨18 unchanged words⟩
⟨287 unchanged words⟩ \"hydra\" (Hydra): 3 credits/s,shortest duration 3s,minsocharge 9 creditsminimum· Most capable all-around model, generates audio\n- ⟨175 unchanged words⟩
SendReportfeedbacka problem with the Ludo API itself to the Ludoteam:team.aUselimitationityouONLYcouldfornotAPIworkbugsaround(an error, abugfailed or stuck job, aresultcrash, a response thatdiddoes not matchthethis documentation,) and API limitations (acapabilityparameter, operation or format you needed thatLudothe API does notoffer yetsupport, and that you could not work around). NEVER use it to report model limitations orpraisetheforqualitysomethingof a result: an image, sprite, animation, 3D model, video or sound thatworkedlookswell.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. Describe what you were trying to do and whatwaswentmissingwrong, and name the operation (and job_id, ⟨37 unchanged words⟩
⟨17 unchanged words⟩ :"string"},"category":{"description":"limitationbug -somethingtheyouAPIneedederrored,thatadidjobnotfailedworkor got stuck, orisa response did notsupported;matchbugthe documentation; limitation -somethingthebroke
⟨344 unchanged words⟩ × seconds, per model: Hydra 3/s (shortest duration 3s,minsocharge 9 creditsminimum), Forge 2/s (min charge 4 credits) ⟨39 unchanged words⟩
⟨491 unchanged words⟩ \"hydra\" (Hydra): 3 credits/s,shortest duration 3s,minsocharge 9 creditsminimum· Most capable all-around model, generates audio\n- ⟨350 unchanged words⟩
⟨131 unchanged words⟩ , `audio_url` on hydra). Credits are held for the duration you requested when the job isaccepted andaccepted; the final charge is max(rate × seconds of video generated, the model's minimum charge), never more than for the duration you requested,(rateand×theduration,difference (or everything, if themodel'sjobminimumfailschargeorifishighercancelled),evenisthoughrefunded.theThe returned sheet is then trimmed to its best loop andusuallycanrunsrun slightlyshorter; everything is refundedshorterifthan thejobvideo;failsthatortrim iscancelled.not deducted. Use animateSprite instead for the classic single-image + ⟨80 unchanged words⟩
⟨22 unchanged words⟩ job result is a single audio result containingatheURL.URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The description field is required and duration is ⟨101 unchanged words⟩
⟨86 unchanged words⟩ job result is a single audio result containingatheURL.URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The optional modification_strength (0 to 1, default ⟨92 unchanged words⟩
⟨23 unchanged words⟩ job result is a single audio result containingatheURL.URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The description field is required; duration must be ⟨111 unchanged words⟩
⟨21 unchanged words⟩ job result is a single audio result containingatheURL.URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). The description field is required, duration is ⟨112 unchanged words⟩
⟨53 unchanged words⟩ job result is a single audio result containingatheURL.URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). Credits are held when the job is accepted ⟨92 unchanged words⟩
⟨36 unchanged words⟩ job result is a single audio result containingatheURL.URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). Credits are held when the job is accepted ⟨95 unchanged words⟩
⟨72 unchanged words⟩ the sound you want. The job result is only the URL of the generated audio file,only;an MP3 or WAV (the URL's extension, .mp3 or .wav, says which); no video is returned. The audio is also ⟨77 unchanged words⟩
⟨61 unchanged words⟩ job result is a single audio result containingatheURL.URL of an MP3 or WAV file (the URL's extension, .mp3 or .wav, says which). Credits are held when the job is accepted ⟨88 unchanged words⟩
⟨115 unchanged words⟩ GIF or individual frames). Credits are held for the duration you requested when the job isaccepted andaccepted; the final charge is max(rate × seconds of video generated, the model's minimum charge), never more than for the duration you requested,(rateand×theduration,difference (or everything, if themodel'sjobminimumfailschargeorifishighercancelled),evenisthoughrefunded.theThe returned sheet is then trimmed to its best loop andusuallycanrunsrun slightlyshorter; everything is refundedshorterifthan thejobvideo;failsthatortrim iscancelled.not deducted. Prompt edits are priced per model (credits/second ⟨180 unchanged words⟩
⟨162 unchanged words⟩ the model/duration combination is invalid. Credits are heldwhenfor thejobdurationisyouacceptedrequestedandwhen thechargejob isforaccepted; thedurationfinalyouchargerequestedis max(rate ×duration,seconds of video generated (which follows the reference clip or preset), the model's minimum charge),ifneverhigher)more than for the duration you requested,evenandthoughthe difference (or everything, if the job fails or is cancelled) is refunded. The returned sheet is then trimmed to its best loop andusuallycanrunsrun slightlyshorter; everything is refundedshorterifthan thejobvideo;failsthatortrim iscancelled.not deducted. Use this when you have an existing motion ⟨147 unchanged words⟩
⟨706 unchanged words⟩ 1.5 credits/s, min charge 4 credits ·UseSharperonlydetail, simpler motion. Best forbasicsimpleanimationsbody shapes andsimpleshortsprites.actions;Multiplemaytriesneedmightabefewneeded\n-tries\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s ⟨386 unchanged words⟩
⟨134 unchanged words⟩ . Credits are held when the job isaccepted;acceptedtheandfinalthe charge ismaxfor the duration you requested (rate ×produced secondsduration, or the model's minimum charge if higher),neverevenmorethoughthantheforreturnedthesheetdurationisyoutrimmedrequested,to its best loop andtheusuallydifferenceruns(orslightly shorter; everything,is refunded if the job fails or iscancelled) is refunded.cancelled. Use animateSprite instead for the classic single-image + ⟨80 unchanged words⟩
⟨716 unchanged words⟩ 1.5 credits/s, min charge 4 credits ·UseSharperonlydetail, simpler motion. Best forbasicsimpleanimationsbody shapes andsimpleshortsprites.actions;Multiplemaytriesneedmightabefewneeded\n-tries\n- \"forge-pixel\" (Forge Pixel): 1.5 credits/s ⟨292 unchanged words⟩
⟨119 unchanged words⟩ . Credits are held when the job isaccepted;acceptedtheandfinalthe charge ismaxfor the duration you requested (rate ×produced secondsduration, or the model's minimum charge if higher),neverevenmorethoughthantheforreturnedthesheetdurationisyoutrimmedrequested,to its best loop andtheusuallydifferenceruns(orslightly shorter; everything,is refunded if the job fails or iscancelled) is refunded.cancelled. Prompt edits are priced per model (credits/second ⟨180 unchanged words⟩
⟨309 unchanged words⟩ 2 credits/s, min charge 4 credits ·Cost-effectiveSharper detail, simpler motion. Best for simpleeditingbodytasks\n-shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 2 credits/s ⟨142 unchanged words⟩
⟨166 unchanged words⟩ invalid. Credits are held when the job isaccepted;acceptedtheandfinalthe charge ismaxfor the duration you requested (rate ×produced secondsduration, or the model's minimum charge if higher),-even though theproducedreturnedlengthsheetfollowsisthetrimmedreferencetoclipits-best loop andtheusuallydifferenceruns(orslightly shorter; everything,is refunded if the job fails or iscancelled) is refunded.cancelled. Use this when you have an existing motion ⟨147 unchanged words⟩
⟨513 unchanged words⟩ 2 credits/s, min charge 4 credits ·Cost-effectiveSharperfordetail,simplesimpler motion.WorksBestbestforwithsimplePresetsbody shapes andmatchingshortposes\n-actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 2 credits/s ⟨317 unchanged words⟩
⟨44 unchanged words⟩ generated with the hydra model already come with`audio_b64``audio_url`, so only call this for forge / ⟨37 unchanged words⟩ to the spritesheet, so it appears as`audio_b64``audio_url` in listGenerations (type spritesheet), where the ⟨62 unchanged words⟩
⟨244 unchanged words⟩ fix on a hydra sheet comes back without`audio_b64`.`audio_url`. Pass an optional `request_id` to tag the result ⟨89 unchanged words⟩
⟨76 unchanged words⟩ GIF / frame / with-background URLs, and`audio_b64``audio_url` when the model is hydra. `duration` defaults to ⟨274 unchanged words⟩
⟨105 unchanged words⟩ the items were generated from: api (yourAPI/MCP/CLIAPI/MCP generations, last 7 days only), web ⟨42 unchanged words⟩
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).
⟨105 unchanged words⟩ the items were generated from: api (yourAPI/MCPAPI/MCP/CLI generations, last 7 days only), web ⟨42 unchanged words⟩
⟨767 unchanged words⟩ ":"Optional text description of the desired animation,(e.g.,\"walking\", \"attack slash\"). When omitted, the motion is derived purely from the keyframes. When provided, describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them. Do not over-describe, though: too much detail can harm the animation, and an action the model already knows should be named, not decomposed into its steps (\"walking\", never \"move the left foot forward, then the right foot\"). Do not restate what the keyframes already show (the character, its appearance and equipment, the art style, the background, the lighting, the camera), and leave frame count and timing to the frames and duration fields. Negative phrasing (\"no background\", \"do not move the camera\", \"without a weapon\") works only on hydra. On forge and forge-pixel it backfires: naming something you do not want makes it more likely to appear, so \"without a weapon\" tends to produce a weapon. On those models never phrase anything negatively; state only what should happen, and control everything else through the keyframes and the other fields.","type":"string"},"request_id":{ ⟨71 unchanged words⟩
⟨333 unchanged words⟩ for low-res pixel art animations Default: \"forge\hydra\".","enum":["hydra","forge" ⟨124 unchanged words⟩
⟨295 unchanged words⟩ , so 9 credits minimum · Most capable all-around model, generates audio\n- \"forge\" (Forge): ⟨160 unchanged words⟩
⟨85 unchanged words⟩ the model is hydra. `duration` defaults to 1.5s- or, whenwhere the chosen modeldoesoffersnotit,offerotherwise1.5sto that model's shortest (hydra, the default, starts at 3s),to that model's shortest- and a longer reference clip or preset ⟨113 unchanged words⟩ a text prompt. Omit `model` to run onforgehydra (the default -cost-effectivemostandcapable,tunedandforreturnspresetsaudio); pickhydraforge forcomplexaspritescheaperorrunwhenonyousimplewantmotion,audio;presets and matching poses; the `model` field lists rates. Pass an optional ⟨96 unchanged words⟩
⟨499 unchanged words⟩ , so 9 credits minimum · Most capable all-around model, generates audio\n- \"forge\" (Forge): ⟨69 unchanged words⟩ current model for anything new. Default: \"forge\hydra\".","enum":["hydra","forge","forge-pixel","tango"],"example":"forgehydra","type":"string"},"perspective":{ ⟨253 unchanged words⟩
⟨96 unchanged words⟩ :"string"},"model":{"description":"The already-rigged 3D asset to animate, as a URL or base64-encodedalready-riggedGLBtofileanimate.(not an AI model name). Rig it firstvia the rigwithendpointrigModel if it has no skeleton.","example": ⟨65 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"}},"required": ⟨8 unchanged words⟩
⟨13 unchanged words⟩ the rigged GLB in `model` (URL orbase64base64; the 3D asset file, not an AI model name) and a `preset_id` from the animation presets list (see the spritesheet animation-presetsfromendpointlistAnimationPresets) - only presets that expose a `clip_url` ⟨77 unchanged words⟩ spot, as game-engine locomotion expects (omit tofollow crop_loop). Credits are charged only on success. Requires ankeepAPIthekeypreset's(userownscopetravel).Returns 202 with a job id immediately; poll `getApiJob`Credits(passare`wait:held30`)whenuntilthestatusjob issucceeded,acceptedthenandreadrefundeditsif`result`itfield,failswhichor isexactly the response documented for this operation. Each accountcancelled.mayAsynchavegenerationupjob:toreturns50`{id,generationsstatus}`queued-orpollrunning`getApiJob`at(jobonce;andbeyondcreditthatcontract:submissionsseereturnthe429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 0.2 credits per call.
⟨42 unchanged words⟩ the spot (engine-driven locomotion). Omit tofollowkeepcrop_loop.the preset's own travel.","type":"boolean"},"model":{"description":"The already-rigged 3D asset, as a URL or base64-encodedalready-riggedGLB file (rignot an AI model name). Rig it witharigModelhumanoid_templateusing rig_typefirst).humanoid_template or humanoid_template_hands first.","example":"<url> OR data:model/gltf-binary;base64,... ⟨42 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"}},"required": ⟨8 unchanged words⟩
⟨55 unchanged words⟩ The job result is a single sprite result: `spritesheet_url` (spritesheettheURLsheet image),frame`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,optionallywhen requested, `gif_url`, `individual_frame_urls` and `spritesheet_with_background_url`. The hydra model also returns `audio_b64`, aGIFsoundoreffectindividualforframetheURLsanimationwhen-requested).there is no need to call createSpriteAudio afterwards; forge and forge-pixel produce no audio. The chosen model must support sprite animation and ⟨7 unchanged words⟩ incompatible model/duration combinations return HTTP 400. Credits arechargedheldonlywhenonthesuccess,jobbasedisonaccepted; the final charge is max(rate × produceddurationseconds,andthe model's minimum charge), never more than for the duration yourequested.requested,Forandbesttheresultsdifference (or everything,callifgeneratePosethefirstjobtofailsputortheischaractercancelled)intoistherefunded.desiredChoosingpose,athentool:animateanimateSpriteit(thishere;one)usewhenlistAnimationPresetsyoutocandiscoverdescribenamedthepresets,motionandinprefertext; transferMotion when youalreadywanthavean exact motion copied from a reference video orpresetonetoofcopythemotionnamedfrompresetsratherfromthanlistAnimationPresetsdescribing(e.g.itainstandardtext.walkPassoranattackoptionalcycle);request_idgeneratePosetofirsttagwhen theresultsourcesoimageyouiscannotlocateyetitinlatertheviapose`GETthe/assets/sprites/results`.animationRequiresshouldanstartAPIfrom.keyOmit(user`model`scope).toReturnsrun202onwithhydraa(thejobdefault)id-immediately;seepollthe`getApiJob``model`(passfield`wait:for30`)theuntilper-modelstatusratesisandsucceeded,thethen4-creditreadminimumitscharge`result`onfield,forge/forge-pixel.whichPassisanexactlyoptionaltherequest_idresponsetodocumentedtagforthethisresultoperation.soEachyouaccountcanmaylocatehaveituplatertovia50listGenerationsgenerations(typequeuedspritesheet).orAsyncrunninggenerationatjob:once;returnsbeyond`{id,thatstatus}`submissions-returnpoll429`getApiJob` (PENDING_JOBS_LIMIT)job-andwaitcreditforcontract:jobsseetothefinish.server instructions). Credits:costcredits/svaries×byseconds, per model:andHydra 3/s (shortest duration 3s, so 9 credits minimum), Forge 1.5/s (credits/secmin charge 4 credits):,HydraForge3/sPixel 1.5/s (min charge 4 credits), Blitz 1.9/s (min charge 4 credits) [LEGACY], Eagle 2.6/s (min charge 4 credits) [LEGACY], Eagle with Audio 3.1/s (min charge 4 credits),Forge[LEGACY];1.5/s[LEGACY](minmodels4),areForgescheduledPixelfor1.5/sremoval(min-4);do not use them for new work; see this endpoint's full pricing table in the API docs.
⟨111 unchanged words⟩ inconsistent frame sizes across different animations. Default:false.true.","example":falsetrue,"type":"boolean"},"duration":{" ⟨12 unchanged words⟩ : 3, 3.5, 4, 4.5, 5\n-blitzforge:1.21, 1.5, 2, 2.5, 3, 3.5,4\n- eagle: 1, 2, 3, 4\n- eagle-audio: 1, 24,34.5,4\n-5\n-forgeforge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5\n-forge-pixelblitz:11.2, 1.5, 2, 2.5, 3, 3.5,44\n- eagle: 1,4.52,53,
⟨65 unchanged words⟩ is derived purely from the keyframes. Runs onthehydraForge(default;familyalso returns `audio_b64`),theforge,onlyor forge-pixel for pixel-art sprites - the modelssupportingthat support a middlekeyframes:keyframe;Forgeany(default)otherormodelForgereturnsPixelHTTPfor400.pixel-artForsprites;justbothasharestarttheandsameenddurationsframe,andanimateSpritepricing.with `final_image` does the same job. The job result isathesinglesame sprite result(spritesheetasURL,animateSpriteframe(`spritesheet_url`,layout`video_url`,andgridoptionallyfields,aoptional GIFor individualand frame URLs,when`audio_b64`requestedon hydra). Credits arechargedheldonlywhenonthesuccess,jobbasedisonaccepted; the final charge is max(rate × produceddurationseconds,andthe model's minimum charge), never more than for the duration yourequested.requested, and the difference (or everything, if the job fails or is cancelled) is refunded. Use animateSprite instead for the classic single-image + text-promptanimation with model choice.animation. Pass an optional request_id to tag the result so you can locate it later via`GET /assets/sprites/results`. Requires an API keylistGenerations (usertypescopespritesheet).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued orserverrunninginstructions). Credits:atcredits/sonce;×beyondseconds,thatpersubmissionsmodel:returnHydra4293/s (PENDING_JOBS_LIMIT) - wait for jobs to finish. Credits: costshortestvariesdurationby3s,modelsoand9durationcredits(credits/secminimum):, Forge 1.5/s (min charge 4 credits), Forge Pixel 1.5/s (min charge 4 credits); see this endpoint's full pricing table in the API docs.
⟨17 unchanged words⟩ initial / middle / final). Runs onthehydraForge(default),familyforge or forge-pixel - theonlymodels supporting a middle keyframe. Input images can ⟨82 unchanged words⟩ inconsistent frame sizes across different animations. Default:false.true.","example":falsetrue,"type":"boolean"},"duration":{" ⟨12 unchanged words⟩ : 3, 3.5, 4, 4.5, 5\n-blitz: 1.2, 1.5, 2, 2.5, 3, 3.5, 4\n- eagle: 1, 2, 3, 4\n- eagle-audio: 1, 2, 3, 4\n-forge: 1, 1.5, 2, 2.5, 3 ⟨536 unchanged words⟩ \"hydra\" (Hydra): 3 credits/s,min 4\n-shortest\"blitz\"duration(Blitz):3s,1.9socredits/s,
Cancel a queued job you started through the API orMCPMCP;andtherefundcreditsitsheldcredits.for it are refunded. Jobs that are already running cannot be canceled (409). Returns the canceled job. This is free (no credits). Requires an API key (user scope).
⟨57 unchanged words⟩ none", default "pbr"). Credits arechargedheldonlywhenonthesuccess.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`GET /assets/3d-models/results`. Requires an API keylistGenerations (usertypescope3d).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 3 credits per call.
⟨35 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"},"target_num_faces":{ ⟨58 unchanged words⟩
⟨46 unchanged words⟩ auto-pick based on the description). Credits arechargedheldonwhensuccess.the job is accepted and refunded if it fails or is cancelled. Use this for continuous, atmospheric background loops; use ⟨25 unchanged words⟩ result so you can locate it later via`GET /assets/audio/results`. Requires an API keylistGenerations (usertypescopeaudio).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 2 credits per call.
⟨111 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"}},"required": ⟨7 unchanged words⟩
⟨96 unchanged words⟩ The optional modification_strength (0 to 1, default0.50.6) controls how far the result departs from the original. Credits arechargedheldonwhensuccess.the job is accepted and refunded if it fails or is cancelled. Use this to transform existing audio you already ⟨18 unchanged words⟩ result so you can locate it later via`GET /assets/audio/results`. Requires an API keylistGenerations (usertypescopeaudio).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 3 credits per call.
⟨157 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"},"sample":{ ⟨29 unchanged words⟩
⟨56 unchanged words⟩ no upload size limit to trip. Credits arechargedheldonlywhenonthesuccess,jobscaledistoaccepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use createImage to make ⟨33 unchanged words⟩ results so you can retrieve them later via`GET /assets/images/results`. Requires an API keylistGenerations (usertypescopeimage).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 0.5 credits per result.
⟨173 unchanged words⟩ maximum":8,"minimum":1,"type":"numberinteger"},"perspective":{"description":"Camera angle/view ⟨69 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"}},"required": ⟨8 unchanged words⟩
⟨57 unchanged words⟩ and out-of-range values return HTTP 400. Credits arechargedheldonwhensuccess.the job is accepted and refunded if it fails or is cancelled. Use this for songs and musical scores; use ⟨25 unchanged words⟩ result so you can locate it later via`GET /assets/audio/results`. Requires an API keylistGenerations (usertypescopeaudio).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 3 credits per call.
⟨120 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"}},"required": ⟨7 unchanged words⟩
⟨55 unchanged words⟩ true for a seamlessly looping effect. Credits arechargedheldonwhensuccess.the job is accepted and refunded if it fails or is cancelled. Use this for short, discrete sounds; use createAmbiance ⟨25 unchanged words⟩ result so you can locate it later via`GET /assets/audio/results`. Requires an API keylistGenerations (usertypescopeaudio).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 2 credits per call.
⟨110 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"}},"required": ⟨7 unchanged words⟩
⟨57 unchanged words⟩ single audio result containing a URL. Credits arechargedheldonwhensuccess.the job is accepted and refunded if it fails or is cancelled. Use this when you have a reference voice ⟨36 unchanged words⟩ result so you can locate it later via`GET /assets/audio/results`. Requires an API keylistGenerations (usertypescopeaudio).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 1 credits per call.
⟨25 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"},"sample":{ ⟨19 unchanged words⟩ ":"Text to convert to speech (max1001000wordscharacters).","maxLength":1000,"minLength":1, ⟨11 unchanged words⟩
⟨40 unchanged words⟩ single audio result containing a URL. Credits arechargedheldonwhensuccess.the job is accepted and refunded if it fails or is cancelled. Use this when you want a ready-made catalog ⟨39 unchanged words⟩ result so you can locate it later via`GET /assets/audio/results`. Requires an API keylistGenerations (usertypescopeaudio).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 1 credits per call.
⟨101 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"},"text":{"description":"Text to convert to speech (max1001000wordscharacters).","maxLength":1000,"type":"string ⟨53 unchanged words⟩
Generate a sound effect for a previously generated spritesheet animation. Pass, as `spritesheet_video_url`, the `video_url` you received from `animateSprite`, `animateSpriteKeyframes`, ⟨15 unchanged words⟩ 7 days; arbitrary external videos are not accepted. Spritesheets generated with the hydra model already come with `audio_b64`, so only call this for forge / forge-pixel output or to replace hydra's sound. Optionally add a `prompt` describing the sound you ⟨24 unchanged words⟩ spritesheet, so it appears as `audio_b64` in`GETlistGenerations/assets/sprites/results`(type spritesheet), where the spritesheet keeps the `request_id` it ⟨21 unchanged words⟩ be one you already used for another generation.Requires an API key (user scope). Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 3 credits per call.
⟨8 unchanged words⟩ 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, 480p) and Griffin HD (720p) both generate a soundtrack; no separate audio step is needed. The job result is the video URL and ⟨36 unchanged words⟩ for the values each model accepts. Credits arechargedheldonlywhenonthesuccess,jobbasedisonaccepted; the final charge is max(rate × produceddurationseconds,andthe model's minimum charge), never more than for the duration yourequested.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`GETlistGenerations/assets/videos/results`.(type video). Related tools: use `createImage` for static images, `animateSprite` for sprite-sheet animation, and`GETlistGenerations/assets/videos/results`(type video) to list videos you generated earlier.Requires an API key (user scope). Returns 202 withAsyncageneration job: returns `{id,immediately;status}` - poll `getApiJob` (pass `wait:job30`)anduntilcreditstatuscontract:isseesucceeded,thethenserverreadinstructions). Credits:itscredits/s`result`×fieldseconds,which isperexactlymodel:theGriffinresponse1.5/sdocumented(shortestfordurationthis5s,operation.soEach7.5accountcreditsmayminimum),haveGriffinupHDto2/s50(shortestgenerationsdurationqueued5s,orsorunning10atcreditsonce;minimum),beyondBlitzthat1/ssubmissions(shortestreturnduration4292s,(PENDING_JOBS_LIMIT)so-2waitcreditsforminimum)jobs[LEGACY],toEaglefinish. Credits:1.3/scost[LEGACY],variesEaglebywithmodelAudioand1.8/sduration[LEGACY];(credits/sec):[LEGACY]Griffinmodels1.5/s,areGriffinscheduledHDfor2/s,removalBlitz-1/s,doEaglenot1.3/s,useEaglethemwithforAudionew1.8/s;work; see this endpoint's full pricing table in the API docs.
⟨113 unchanged words⟩ 14, 15 Default: 5.","example":35,"format":"float","type":"number" ⟨55 unchanged words⟩ models:\n- \"griffin\" (Griffin): 1.5credits/s\n-credits/s, shortest duration 5s, so 7.5 credits minimum · Fast cinematic videos in any style, with audio, 480p\n- \"griffin-hd\" (Griffin HD): 2credits/s\n-credits/s, shortest duration 5s, so 10 credits minimum · Same as Griffin, but in 720p\n- \"blitz\" (Blitz): 1credits/s\n-credits/s, shortest duration 2s, so 2 credits minimum · LEGACY - scheduled for removal, do not use for new work\n- \"eagle\" (Eagle): 1.3credits/s\n-credits/s · LEGACY - scheduled for removal, do not use for new work\n- \"eagle-audio\" (Eagle with Audio): 1.8credits/s\nLegacycredits/s · LEGACY - scheduled for removal, do not use for new work\nLegacy aliases: \"standard\" →blitz.blitz.\nModels marked LEGACY still work for existing integrations but will be removed; pick a current model for anything new.
⟨36 unchanged words⟩ Each image can be a URL or base64. Griffin (default, 480p) and Griffin HD (720p) generate a soundtrack; note the per-second rate here is higher than createVideo's for the same model. The job result is the video URL and ⟨25 unchanged words⟩ incompatible combinations return HTTP 400). Credits arechargedheldonlywhenonthesuccess,jobbasedisonaccepted; the final charge is max(rate × produceddurationseconds,andthe model's minimum charge), never more than for the duration yourequested.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`GETlistGenerations/assets/videos/results`.(type video). Related tools: `createVideo` for image-to-video, `editVideo` to modify a generated video.Requires an API key (user scope). Returns 202 withAsyncageneration job: returns `{id,immediately;status}` - poll `getApiJob` (pass `wait:job30`)anduntilcreditstatuscontract:isseesucceeded,thethenserverreadinstructions). Credits:itscredits/s`result`×fieldseconds,which is exactly the response documented for thisperoperation.model:EachGriffinaccount2.5/smay(shortesthavedurationup5s,toso5012.5generationscreditsqueuedminimum),orGriffinrunningHDat4/sonce;(shortestbeyonddurationthat5s,submissionssoreturn20429credits(PENDING_JOBS_LIMITminimum)- wait,forEaglejobs1.5/sto[LEGACY],finish. Credits:EaglecostwithvariesAudioby2/smodel[LEGACY];and[LEGACY]durationmodels(credits/sec):areGriffinscheduled2.5/s,forGriffinremovalHD-4/s,doEaglenot1.5/s,useEaglethemwithforAudionew2/s;work; see this endpoint's full pricing table in the API docs.
⟨157 unchanged words⟩ models:\n- \"griffin\" (Griffin): 2.5credits/s\n-credits/s, shortest duration 5s, so 12.5 credits minimum · Fast cinematic videos in any style, with audio, 480p\n- \"griffin-hd\" (Griffin HD): 4credits/s\n-credits/s, shortest duration 5s, so 20 credits minimum · Same as Griffin, but in 720p\n- \"eagle\" (Eagle): 1.5credits/s\n-credits/s · LEGACY - scheduled for removal, do not use for new work\n- \"eagle-audio\" (Eagle with Audio): 2 credits/s · LEGACY - scheduled for removal, do not use for new work\nModels marked LEGACY still work for existing integrations but will be removed; pick a current model for anything new. Default: \"eagle\griffin\".","enum":["griffin","griffin-hd","eagle","eagle-audio"],"example":"eaglegriffin","type":"string"},"prompt":{ ⟨24 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.
⟨65 unchanged words⟩ single audio result containing a URL. Credits arechargedheldonwhensuccess.the job is accepted and refunded if it fails or is cancelled. Use this to invent and audition a voice ⟨32 unchanged words⟩ result so you can locate it later via`GET /assets/audio/results`. Requires an API keylistGenerations (usertypescopeaudio).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 1 credits per call.
⟨47 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"},"text":{"description":"Text for the voice to speak (max20200wordscharacters).","maxLength":200,"minLength":1, ⟨48 unchanged words⟩
⟨71 unchanged words⟩ 15MB is rejected with HTTP 400. Credits arechargedheldonlywhenonthesuccess,jobscaledistoaccepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use editImage to transform ⟨32 unchanged words⟩ results so you can retrieve them later via`GET /assets/images/results`. Requires an API keylistGenerations (usertypescopeimage).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 0.5 credits per result.
⟨142 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"}},"required": ⟨8 unchanged words⟩
⟨25 unchanged words⟩ Pass the `spritesheet_url` you received from `animateSprite`, `animateSpriteKeyframes`, `transferMotion`, or an earlier edit - it must ⟨8 unchanged words⟩ 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", ⟨37 unchanged words⟩ optional GIF or individual frames). Credits arechargedheldonlywhenonthesuccess,jobbasedisonaccepted; the final charge is max(rate × produceddurationseconds,andthe model's minimum charge), never more than for the duration yourequested.requested,Passandantheoptionaldifference`request_id`(ortoeverything,tagif theresultjobforfailslaterorretrievalisviacancelled)`GETis/assets/sprites/results`.refunded.RequiresPromptaneditsAPIarekeypriced per model (usercredits/secondscope× duration).;Returns"outpaint"202andwith"fix_loop" run ajoblighteridpipelineimmediately;inpollwhich`getApiJob``model` is ignored and are billed at a flat 1 credit per second of the output duration (passthe`wait:source30`spritesheet's duration unless you pass one).untilOutpaintstatusdecides the extra margin itself - there issucceeded,nothenamountreadparameter.itsThe`result`resultfieldcarries the same fields as animateSprite (`spritesheet_url`,which`video_url`, grid fields); audio isexactlygeneratedtheonlyresponsebydocumentedpromptforeditsthisonoperation.hydra,Eachsoaccountamayfixhaveonupatohydra50sheetgenerationscomesqueuedbackorwithoutrunning`audio_b64`.atPassonce;anbeyondoptionalthat`request_id`submissionstoreturntag429the result for later retrieval via listGenerations (PENDING_JOBS_LIMITtype spritesheet). Async generation job: returns `{id, status}` -waitpollfor`getApiJob`jobs(jobtoandfinish.credit contract: see the server instructions). Credits:costedit_modevaries"fix_loop"by/ "outpaint": flat 1 credit per second of output, no minimum, modelandignored;durationedit_mode(credits/sec)"prompt": per model as listed - credits/s × seconds, per model: Hydra 3/s (minshortest4duration 3s, so 9 credits minimum), Forge 2/s (min charge 4 credits), Forge Pixel 2/s (min charge 4 credits); see this endpoint's full pricing table in the API docs.
⟨24 unchanged words⟩ {"description":"Crop sprite frames to fitcontent.content (omit to keep the source spritesheet's setting). Results in smaller spritesheets but inconsistent frame sizes ⟨74 unchanged words⟩ and height). 0 is for maximum resolution.DefaultsOmit to keep the source spritesheet's frame size. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0.","example":32,"format":"integer","type":"number"},"frames":{"description":"Number of frames in the output spritesheet.DefaultsOmit to keep the source spritesheet's frame count. Accepted values: 4, 9, 16, 25, 36, 49, 64.","example":4,"format":"integer","type":"number"}, ⟨90 unchanged words⟩ create a seamless loop. Default: true.","example":true,"type":"boolean"},"model":{"description" ⟨6 unchanged words⟩ \"hydra\" (Hydra): 3 credits/s,minshortest4\n-duration 3s, so 9 credits minimum · Most capable model, generates audio\n- \"forge\" (Forge): 2 credits/s, min4\n-
⟨7 unchanged words⟩ text prompt and optional reference images (video-to-video).; runs on griffin-hd (720p, with soundtrack) and the output keeps the source video's duration unless you pass one. Pass the video `url` you received from `createVideo`, ⟨46 unchanged words⟩ and its actual duration in seconds. Credits arechargedheldonlywhenonthesuccess,jobbasedisonaccepted; the final charge is max(rate × produceddurationseconds,andthe model's minimum charge), never more than for the duration yourequested.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`GETlistGenerations/assets/videos/results`.(type video). Related tools: `createVideo` to generate the source clip, `createVideoFromReferences` for reference-driven generation.Requires an API key (user scope). Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account mayserverhaveinstructions). Credits:upcredits/sto×50seconds,generationsperqueuedmodel:orGriffinrunningHDat2/sonce;(shortestbeyonddurationthat5s,submissionssoreturn10429credits(PENDING_JOBS_LIMITminimum)-,waitEaglefor2/sjobs[LEGACY];to[LEGACY]finish. Credits:modelscostarevariesscheduledbyformodelremovaland-durationdo(credits/sec):notGriffinuseHDthem2/s,forEaglenew2/s;work; see this endpoint's full pricing table in the API docs.
⟨94 unchanged words⟩ \n- \"griffin-hd\" (Griffin HD): 2credits/s\n-credits/s, shortest duration 5s, so 10 credits minimum · Same as Griffin, but in 720p\n- \"eagle\" (Eagle): 2 credits/s · LEGACY - scheduled for removal, do not use for new work\nModels marked LEGACY still work for existing integrations but will be removed; pick a current model for anything new. Default: \"eagle\griffin-hd\".","enum":["griffin-hd","eagle"],"example":"eaglegriffin-hd","type":"string"},"prompt":{ ⟨23 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"},"video":{ ⟨37 unchanged words⟩
⟨73 unchanged words⟩ suggested motion_prompt tuned for that pose. Credits arechargedheldonlywhenonthesuccess,jobscaledisbyaccepted and refunded if it fails or is cancelled; the charge scales with the number of images generated. This is typically the ⟨48 unchanged words⟩ results so you can locate them later via`GET /assets/sprites/results`. Requires an API keylistGenerations (usertypescopespritesheet).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 0.5 credits per result.
⟨188 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"}},"required": ⟨8 unchanged words⟩
⟨20 unchanged words⟩ text prompt describing what to create and an optional image_type (defaults to sprite). The job result ⟨30 unchanged words⟩ 15MB is rejected with HTTP 400. Credits arechargedheldonlywhenonthesuccess,jobscaledistoaccepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use this instead of ⟨37 unchanged words⟩ results so you can retrieve them later via`GET /assets/images/results`. Requires an API keylistGenerations (usertypescopeimage).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 0.5 credits per result.
⟨135 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"},"style_image":{ ⟨19 unchanged words⟩ string"}},"required":["style_image","prompt","image_type"],"type":"object"}},"required" ⟨3 unchanged words⟩
Poll the status of a generation job started by any tool. Every generation tool returns `{id, status}`; call getApiJob ⟨51 unchanged words⟩
{"properties":{"id":{"description":"The job id returned by a generation call (its `id` in the 202 response).","type":"string"},"wait":{"description" ⟨23 unchanged words⟩
⟨218 unchanged words⟩ charge credits and does not queue a job.Requires an API key (user scope).
⟨119 unchanged words⟩ clip_url-backed preset to a rigged 3D model).Requires an API key (user scope).
⟨37 unchanged words⟩ defaults to 50 and is capped at 100.Requires an API key (user scope).
⟨38 unchanged words⟩ higher-quality output that may not match the inputpixel-for-pixel.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 ⟨18 unchanged words⟩ 15MB is rejected with HTTP 400. Credits arechargedheldonlywhenonthesuccess.job is accepted and refunded if it fails or is cancelled. Use removeBackground for this dedicated cutout task; editImage ⟨33 unchanged words⟩ result so you can retrieve it later via`GET /assets/images/results`. Requires an API keylistGenerations (usertypescopeimage).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 0.5 credits per result.
⟨85 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"}},"required": ⟨7 unchanged words⟩
⟨18 unchanged words⟩ animated. Accepts a URL or base64-encoded GLB in`model`.`model` (here `model` is the 3D asset file, not an AI model name - there is no model choice on the 3D tools). The job result is a downloadable `model_url` for ⟨69 unchanged words⟩ vroid - without changing the skeleton. Credits arechargedheldonlywhenonthesuccess.job is accepted and refunded if it fails or is cancelled. Rigging is non-destructive to geometry but replaces any ⟨4 unchanged words⟩ made against an old rig no longer apply.Requires an API key (user scope). Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 1 credits per call.
⟨58 unchanged words⟩ :"string"},"model":{"description":"The 3D asset to rig, as a URL or base64-encoded GLBtofilerig.(not an AI model name).","example":"<url> OR data:model/gltf-binary;base64,... ⟨16 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"},"rig_type":{"description":"Which skeleton tobuild:build. Pick humanoid_template (or humanoid_template_hands) if you intend to use animate3DModelPreset later - the default general rig cannot take presets. general (any asset), humanoid (anime-style characters ⟨58 unchanged words⟩
⟨90 unchanged words⟩ camera_rotation and camera_elevation that were applied. Credits arechargedheldonlywhenonthesuccess,jobscaledisbyaccepted and refunded if it fails or is cancelled; the charge scales with the number of images generated. Use this to produce ⟨35 unchanged words⟩ results so you can retrieve them later via`GET /assets/sprites/results`. Requires an API keylistGenerations (usertypescopespritesheet).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: This endpoint consumes 0.5 credits per result.
⟨165 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"}},"required": ⟨8 unchanged words⟩
⟨192 unchanged words⟩ charge credits and does not queue a job.Requires an API key (user scope).
⟨37 unchanged words⟩ URL or a preset_id together with perspective anddirection.direction (all three from listAnimationPresets; if both video and preset_id are sent the video wins). The job result isathesinglesame sprite result(spritesheetasURLanimateSprite: `spritesheet_url`,plus`video_url`, grid fields, optional GIF / frame / with-background URLs,individualandframes`audio_b64` when the model is hydra. `duration` defaults to 1.5s - or, when the chosen model does not offer 1.5s (hydra starts at 3s), to that model's shortest - and a longer reference clip orwith-backgroundpresetspritesheetiswhencompressedrequestedto fit, so pass the preset's own `duration` (returned by listAnimationPresets).to keep its timing. It returns HTTP 400 if neither a video ⟨18 unchanged words⟩ if the model/duration combination is invalid. Credits arechargedheldonlywhenonthesuccess,jobbasedisonaccepted; thespritesheet'sfinalactualcharge is max(rate × produceddurationseconds,(whichthemaymodel'sbeminimumshortercharge)than-requestedtheifproduced length follows the referencevideoclip - and the difference (or everything, if the job fails or isshortercancelled).is refunded. Use this when you have an existing motion ⟨6 unchanged words⟩ animateSprite to generate animation purely from a textprompt,prompt.andOmitcall`model`listAnimationPresetstofirstruntoongetforgevalid(thepreset_id,defaultperspective,- cost-effective anddirectiontunedvalues.for presets); pick hydra for complex sprites or when you want audio; the `model` field lists rates. Pass an optional request_id to tag the result so you can retrieve it later via`GET /assets/sprites/results`. Requires an API keylistGenerations (usertypescopespritesheet).Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits:cost varies bycredits/smodel×andseconds,durationper(credits/sec)model: Hydra 3/s (minshortest4duration 3s, so 9 credits minimum), Forge 2/s (min charge 4 credits), Forge Pixel 2/s (min charge 4 credits), Tango 4/s (min charge 4 credits) [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.
⟨33 unchanged words⟩ inconsistent frame sizes across different animations. Default:false.true.","example":falsetrue,"type":"boolean"},"direction":{" ⟨182 unchanged words⟩ :"boolean"},"image":{"description":"Payload for generating an animated spritesheet from aThe staticimage. Inputspriteimagestocananimate,eitherasbeaprovidedURLinor base64or URL.image.IfIdeallythean
⟨33 unchanged words⟩ 7 days; arbitrary external videos are not accepted.OnlyBothvideosdimensionsbelowof960x960thepixelssourcecanmust beupscaledunder 960 pixels: griffin (larger480p)sourcesoutputarequalifies;rejectedgriffin-hd (720p).output does not, landscape or portrait (only a square 720x720 would) - generate on griffin if you intend to upscale. 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 ofmodel,model;chargedheldonlywhenonthesuccess.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`GETlistGenerations/assets/videos/results`.(type video). Related tools: `createVideo` for image-to-video, `editVideo` to modify a generated video.Requires an API key (user scope). Returns 202 withAsyncageneration jobid immediately; poll `getApiJob` (pass `wait:30`)returnsuntil`{id, statusis succeeded,}`then-readpollits`getApiJob``result`(jobfield,andwhichcreditiscontract:exactlysee theresponse documented for this operation. Each account may have up to 50 generations queued or running at once; beyond that submissions return 429server(PENDING_JOBS_LIMITinstructions)- wait for jobs to finish.. Credits: 0.2 credits per second of video.
⟨29 unchanged words⟩ existing job instead of generating again. Also usablewithas theresultsrequest_idendpoint.filter of listGenerations.","type":"string"},"video":{ ⟨16 unchanged words⟩ or editVideo). External URLs are not accepted.OnlyBothvideosdimensionsbelowmust960x960be under 960 pixelscan(griffinbe480pupscaled.output qualifies; griffin-hd 720p output does not, except square).","type":"string"}},"required": ⟨7 unchanged words⟩
⟨137 unchanged words⟩ seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- blitz: 1.2, 1.5, 2, 2.5, 3 ⟨14 unchanged words⟩ 1.5, 2, 2.5, 3, 3.5,4\n-4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 Default: 3.","example":3,"format": ⟨75 unchanged words⟩ -1, -9. Default: 0.","example":320,"format":"integer","type":"number" ⟨16 unchanged words⟩ 49, 64. Default: 36.","example":436,"format":"integer","type":"number" ⟨400 unchanged words⟩ :"Model to use. Available models:\n- \"blitz\hydra\" (BlitzHydra):Visual3Quality:credits/s,4/10min·4\n-Motion\"blitz\"Stability(Blitz):8/10 ·1.9 credits/s, min 4\n- \"eagle\" (Eagle):Visual Quality: 8/10 · Motion Stability: 5/10 ·2.6 credits/s, min 4\n- \"eagle-audio\" (Eagle with Audio):Visual Quality: 8/10 · Motion Stability: 5/10 ·3.1 credits/s, min 4\n- \"forge\" (Forge ⟨17 unchanged words⟩ Default: \"forge\".","enum":["hydra","blitz","standard","eagle","eagle-audio", ⟨104 unchanged words⟩
Only numbers and dates differ: this server embeds live figures in the definition, so the text moves without the contract changing.
⟨76 unchanged words⟩ 1024, 2048. Default: 2048.","example":10242048,"type":"integer"},"texture_type":{" ⟨23 unchanged words⟩
⟨186 unchanged words⟩ varies by model and duration (credits/sec): Griffin 1.5/s, Griffin HD 2/s, Blitz 1/s, Eagle 1.3/s, Eagle with Audio ⟨11 unchanged words⟩
⟨39 unchanged words⟩ seconds. Available values depend on the model:\n- griffin: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15\n- griffin-hd: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15\n- blitz: 2, 3, 4, 5, 6 ⟨97 unchanged words⟩ :"Model to use. Available models:\n- \"blitz\griffin\" (BlitzGriffin):Visual Quality:1.54/10credits/s\n-·\"griffin-hd\"Motion(GriffinStabilityHD):8/10 · 12 credits/s\n- \"eagle\blitz\" (EagleBlitz):Visual Quality: 8/101·credits/s\n-Motion\"eagle\"Stability(Eagle):5/10 ·1.3 credits/s\n- \"eagle-audio\" (Eagle with Audio):Visual Quality: 8/10 · Motion Stability: 5/10 ·1.8 credits/s\nLegacy aliases: \"standard\" → blitz. Default: \"eagle\".","enum":["griffin","griffin-hd","blitz","standard","eagle","eagle-audio"] ⟨66 unchanged words⟩
⟨194 unchanged words⟩ varies by model and duration (credits/sec): Griffin 2.5/s, Griffin HD 4/s, Eagle 1.5/s, Eagle with Audio 2/s; see this ⟨8 unchanged words⟩
⟨48 unchanged words⟩ seconds. Available values depend on the model:\n- griffin: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15\n- griffin-hd: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15\n- eagle: 1, 2, 3, 4, 5 ⟨67 unchanged words⟩ :"Model to use. Available models:\n- \"eagle\griffin\" (EagleGriffin):Visual Quality:2.58/10credits/s\n-·\"griffin-hd\"Motion(GriffinStabilityHD):5/104·credits/s\n- \"eagle\" (Eagle): 1.5 credits/s\n- \"eagle-audio\" (Eagle with Audio):Visual Quality: 8/10 · Motion Stability: 5/10 ·2 credits/s Default: \"eagle\".","enum":["griffin","griffin-hd","eagle","eagle-audio"],"example":"eagle" ⟨50 unchanged words⟩
⟨203 unchanged words⟩ varies by model and duration (credits/sec): Hydra 3/s (min 4), Forge 2/s (min 4), Forge Pixel 2/s ⟨13 unchanged words⟩
⟨48 unchanged words⟩ seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- forge: 1, 1.5, 2, 2.5, 3, 3.5,4\n-4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5","format":"float","type":"number ⟨191 unchanged words⟩ :"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, min 4\n- \"forge\" (Forge): 2 credits/s, min 4\n- ⟨8 unchanged words⟩ Default: \"forge\".","enum":["hydra","forge","forge-pixel"],"example":"forge" ⟨121 unchanged words⟩
⟨187 unchanged words⟩ varies by model and duration (credits/sec): Griffin HD 2/s, Eagle 2/s; see this endpoint's full pricing table in the API docs.
⟨23 unchanged words⟩ seconds. Available values depend on the model:\n- griffin-hd: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15\n- eagle: 1, 2, 3, 4, 5 ⟨40 unchanged words⟩ :"Model to use. Available models:\n- \"eagle\griffin-hd\" (Eagle): VisualGriffinQualityHD):8/102·credits/s\n-Motion\"eagle\"Stability(Eagle):5/10 ·2 credits/s Default: \"eagle\".","enum":["griffin-hd","eagle"],"example":"eagle","type" ⟨77 unchanged words⟩
⟨70 unchanged words⟩ ","splash","3d"],"example":"genericsprite","type":"string"},"n":{ ⟨103 unchanged words⟩
Read Ludo's own guidance forBrowseaorfeaturereadbeforeLudo'syouowngeneratedocumentationwithinitfull - how to choose a sprite animation mode ⟨14 unchanged words⟩ 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 ⟨16 unchanged words⟩ the API and MCP surfaces just the same.CallTo browse, call it with NO parametersfirstto get a table of contents - every ⟨51 unchanged words⟩ Section titles match ignoring case, spacing and punctuation, but are never guessed: when only some requested titles exist you ⟨52 unchanged words⟩
⟨241 unchanged words⟩ varies by model and duration (credits/sec): Hydra 3/s (min 4), Forge 2/s (min 4), Forge Pixel 2/s ⟨17 unchanged words⟩
⟨89 unchanged words⟩ duration. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5\n- forge: 1, 1.5, 2, 2.5, 3, 3.5,4\n-4, 4.5, 5\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5,4\n-4, 4.5, 5\n- tango: 1, 1.5, 2, 2.5, 3 ⟨35 unchanged words⟩ 384, 0. Default: 0.","example":320,"format":"integer","type":"number" ⟨16 unchanged words⟩ 49, 64. Default: 36.","example":436,"format":"integer","type":"number" ⟨299 unchanged words⟩ :"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, min 4\n- \"forge\" (Forge): 2 credits/s, min 4\n- ⟨15 unchanged words⟩ Default: \"forge\".","enum":["hydra","forge","forge-pixel","tango"],"example": ⟨45 unchanged words⟩ using a preset, `perspective` and `direction` are required.","type":"string"},"prompt":{"description":"Optional extra instructions for the motion transfer (e.g. \"keep the cape still\"), added to the model's own prompt.","type":"string"},"request_id":{ ⟨116 unchanged words⟩
Generate a sound effect for a previously generated spritesheet animation. Pass 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. Optionally add a `prompt` describing the sound you want. The job result is the URL of the generated audio file only; no video is returned. The audio is also attached to the spritesheet, so it appears as `audio_b64` in `GET /assets/sprites/results`, where the spritesheet keeps the `reques…
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 docu…
⟨199 unchanged words⟩ (credits/sec): Eagle 1.5/s, Eagle with Audio2/s, Forge Pixel 2/s (min 4);2/s; see this endpoint's full pricing table in the API docs.
⟨82 unchanged words⟩ 10, 11, 12, 13, 14,15\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 415 Default: 5.","example":5,"format" ⟨62 unchanged words⟩ 8/10 · Motion Stability: 5/10 · 2credits/s\n- \"forge-pixel\" (Forge Pixel): 2credits/s,min 4Default: \"eagle\".","enum":["eagle","eagle-audio","forge-pixel"],"example":"eagle","type":" ⟨49 unchanged words⟩
⟨188 unchanged words⟩ by model and duration (credits/sec): Eagle2/s, Forge Pixel 2/s (min 4);2/s; see this endpoint's full pricing table in the API docs.
⟨41 unchanged words⟩ 10, 11, 12, 13, 14,15\n- forge-pixel: 1, 1.5, 2, 2.5, 3, 3.5, 415","format":"float","type":"number ⟨37 unchanged words⟩ 8/10 · Motion Stability: 5/10 · 2credits/s\n- \"forge-pixel\" (Forge Pixel): 2credits/s,min 4Default: \"eagle\".","enum":["eagle","forge-pixel"],"example":"eagle","type":" ⟨77 unchanged words⟩
⟨42 unchanged words⟩ :"string"},"sections":{"description":"Comma-separated sectionSection titles to return from `doc`, copied from the table of contents (an array of titles; over plain REST, a comma-separated string, where a title that itself contains a comma is still matchedcase-insensitivelywhole).againstMatching ignores case, spacing and punctuation; titles thatdocument'smatchsectionnothingtitles.are reported back in `unmatched_sections` rather than guessed at. Only valid together with `doc`. Omit to return ⟨13 unchanged words⟩