Skip to main content
Glama

Server Details

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

Ownership verified
Status
Healthy
Uptime
99.0% over 60 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
Ludo-AI/ludo-mcp
GitHub Stars
7
Server Listing
Ludo AI Game Assets

TDQS

A4.3/5.0

Scored across 38 tools

Disambiguation4/5

The many overlapping generation tools (animateSprite vs animateSpriteKeyframes vs transferMotion vs rotateSpritesheet, createImage vs generateWithStyle vs editImage vs removeBackground, createSpeech vs createSpeechPreset vs createVoice) are each explicitly contrasted in their descriptions, so boundaries are learnable. A few pairs like adjustSpritesheet/editSpritesheet/rotateSpritesheet and createVideo/createVideoFromReferences still require careful reading, but the set largely self-disambiguates.

Naming Consistency4/5

Names are uniformly snake_case and follow an action-first pattern (create*, edit*, animate*, list*, get*), which is predictable. The verb vocabulary is broad (generate, transfer, rotate, adjust, rig, upscale) rather than a single canonical verb set, but consistency of style is maintained.

Tool Count3/5

38 tools is heavy and near the boundary where an agent's selection burden grows, though the server spans several distinct media domains (sprite, 3D, video, audio, image, docs, jobs, account). Each tool maps to a real operation, but the surface could likely be consolidated (e.g. preset vs free-text animation variants).

Completeness5/5

Lifecycle coverage is strong: generate, edit, rotate, re-cut, upscale and audio-attach for sprites; create/rig/animate for 3D; create/edit/upscale for video; numerous audio generation paths; plus jobs, generations, account, docs, and feedback. Discovery and cleanup gaps are minimal, with outputs expiring automatically rather than needing explicit deletion.

Available Tools

43 tools
adjustSpritesheetInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for re-exporting a previously generated sprite animation with different sheet settings (Adjust Sprite Sheet in the web app).
animate3DModelAInspect

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

Credits: This endpoint consumes 0.2 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses that the job is async, returns {id, status}, requires polling getApiJob, holds credits once per call regardless of variant count, refunds on failure or cancellation, and that animation quality is hit-or-miss. It also describes the output artifacts (standalone animation-only GLB in glb_url plus mp4 preview_url) so the agent knows exactly what comes back.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense paragraph that is front-loaded with the core purpose and then layers in prerequisites, output format, mode selection, and billing behavior. Every sentence adds useful information, but the length and density could be trimmed slightly for easier scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity—an async, credit-consuming generation job with multiple parameters and no output schema—the description is complete. It explains the return shape ({id, status}), the need to poll getApiJob, the nature of the output artifacts, and the credit contract, leaving no critical gaps for an agent to call and follow up on the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already contains detailed descriptions for every inner parameter (loop, mode, model, prompt, request_id, num_variants, augment_prompt), so the schema does the heavy lifting. The tool description largely repeats that information (model must have skeleton, mode options, num_variants default 4) and adds little parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Generate text-driven skeletal animations for an already-rigged 3D model.' It distinguishes itself from rigModel by noting the model must already have a skeleton and that rigModel should be used first. However, it does not explicitly differentiate from close siblings like animate3DModelPreset or transferMotion, leaving that to inference from the tool name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use it for an already-rigged model with a skeleton, and rig first with rigModel if not. It also explains when to use mode rot_trans vs rot_only and warns against disabling augment_prompt. It does not, however, name alternative animation tools (e.g., animate3DModelPreset, transferMotion) or explicitly state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

animate3DModelPresetAInspect

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

Credits: This endpoint consumes 0.2 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it discloses the async job contract (returns {id, status}, poll getApiJob), the credit lifecycle (held on acceptance, refunded on failure/cancel), the 0.2-credit cost, and the exact result shape (standalone animation-only GLB in glb_url plus mp4 preview_url in the animations envelope). It also explains the behavioral effect of crop_loop and in_place, including the default when omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then prerequisites, then output/credit contract, then per-flag semantics. Dense but every clause adds operational value. Heavy parenthetical nesting makes it slightly harder to scan than an ideal two-tier structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-annotation, no-output-schema async tool, the description supplies everything an agent needs: rig precondition, preset source, async polling path, credit implications, and return fields. Nothing material is left to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Reported schema coverage is 0%, so the description must compensate, and it does: it clarifies model is a rigged asset file (not an AI model name), that preset_id accepts any id from the presets list, and that crop_loop/in_place fall back to the preset's own flags when omitted. This is meaningful beyond a bare parameter list, though request_id semantics are only partially echoed from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Apply a curated animation preset to an already-rigged 3D model (retargeting)') and immediately distinguishes itself from siblings by requiring a preset_id from listAnimationPresets rather than freeform motion (animate3DModel) or motion transfer (transferMotion). An agent can route to it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete prerequisites: the model must carry a humanoid-template rig (rig_type humanoid_template or humanoid_template_hands) and the preset_id must come from listAnimationPresets. It also routes the async follow-up to getApiJob. It stops short of explicitly naming the alternative sibling (animate3DModel) and the condition that would select it, so it is strong context rather than full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

animateSpriteInspect

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

Credits: credits/s × seconds, per model: Hydra 3/s (shortest duration 3s, so 9 credits minimum), Hydra+ 4/s (shortest duration 3s, so 12 credits minimum), Forge 1.5/s, Forge Pixel 1.5/s, 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) [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.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload 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.
animateSpriteKeyframesInspect

Animate a sprite through up to three fixed keyframes - initial_image, middle_image and final_image (each a URL or base64) - producing a spritesheet that interpolates through the provided frames in order. At least one of initial_image or middle_image is required (a final_image alone has nothing to anchor the animation); any keyframe may be omitted. The motion_prompt is optional here - when omitted, the motion is derived purely from the keyframes. Runs on hydra (default; also returns audio_url), hydra-plus (hydra with finer detail, also returns audio_url), forge, or forge-pixel for pixel-art sprites - the models that support a middle keyframe; any other model returns HTTP 400. For just a start and end frame, animateSprite with final_image does the same job. The job result is the same sprite result as animateSprite (spritesheet_url, video_url, grid fields, optional GIF and frame URLs, audio_url on hydra and hydra-plus). Credits are held for the duration you requested when the job is accepted; the final charge is rate × seconds of video generated, never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. The returned sheet is then trimmed to its best loop and can run slightly shorter than the video; that trim is not deducted. Use animateSprite instead for the classic single-image + text-prompt animation. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type spritesheet). Async generation job: returns {id, status} - poll getApiJob (job and credit contract: see the server instructions).

Credits: credits/s × seconds, per model: Hydra 3/s (shortest duration 3s, so 9 credits minimum), Hydra+ 4/s (shortest duration 3s, so 12 credits minimum), Forge 1.5/s, Forge Pixel 1.5/s; see this endpoint's full pricing table in the API docs.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload 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.
cancelApiJobAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It discloses side effects (credits refunded), cost (free), a key error condition (running jobs return 409), and the return value (the canceled job). This is substantive and useful, though it omits details like ownership requirements or irreversibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences with no wasted words. The main action is front-loaded, followed by the refund behavior, the running-job restriction, and the no-cost note. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter cancellation tool with no output schema, the description covers purpose, conditions, side effects, cost, and return value. It is reasonably complete, though it could have mentioned where to obtain the job id or how to verify a job is queued.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain what 'id' refers to beyond 'a job.' The single parameter id is left entirely to inference from the tool name. For a low-coverage schema, the description should clarify the id's source or format, but it does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource ('Cancel a queued job') and explicitly ties the tool to jobs started through the API or MCP. It distinguishes itself from sibling tools like getApiJob and listApiJobs by focusing on the cancellation action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit conditions: queued jobs can be canceled, running jobs cannot (409). It also notes the operation is free. However, it does not mention alternatives like checking status via getApiJob or listApiJobs first, so guidance is strong but not fully comparative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create3DModelInspect

Convert a source image into a textured 3D model (image-to-3D). The job result is a downloadable GLB model_url plus an array of snapshot image URLs rendered from different angles (handy for previews). model picks the generator: prop (default) is low-cost and suits everyday props and environment pieces; hero is far more detailed and accurate, for close-up assets, but slower and more expensive. image is the front view; with prop, pass an optional back_image (the same subject seen from behind) so the back of the model follows it instead of being invented - hero takes the front image only and rejects a back_image with HTTP 400. Accepts optional mesh controls: target_num_faces (max triangle count, 1000-200000, default 50000), texture_size (1024 or 2048, default 2048), and texture_type ("pbr", "simple", or "none", default "pbr"). Pass rig true to also rig the model in the same call (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 and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type 3d). Async generation job: returns {id, status} - poll getApiJob (job and credit contract: see the server instructions).

Credits: This endpoint consumes 4 credits per call with model "prop" (default), 15 credits per call with model "hero"; rig true adds 1 credit when the model comes back rigged.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYes
createAmbianceAInspect

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

Credits: This endpoint consumes 2 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for generating a seamless looping ambiance soundscape from a text description

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and succeeds: it discloses async generation, the returned `{id, status}` shape, polling via getApiJob, credit hold/refund behavior, cost (2 credits), and the output URL format. This is rich behavioral context beyond what the schema alone provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and well-structured, moving logically to alternatives, request tagging, async behavior, and credits. It is somewhat long and repeats a few schema details, but every sentence serves practical invocation or selection value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description is complete enough: it explains the async job lifecycle, result format, polling, credit contract, required and constrained parameters, and sibling alternatives. An agent has everything needed to select and correctly invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the nested properties in detail. The description restates that `description` is required and that duration is capped at 10 seconds (0 means auto), but adds no syntax, format, or semantic detail beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Produce a looping background ambiance soundscape from a text description.' It also names the sibling tools it is not (createSoundEffect, createMusic, createAudioTransform), so an agent can distinguish its role without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use this tool: 'Use this for continuous, atmospheric background loops,' and gives three alternatives with their own use cases: createSoundEffect for short discrete effects, createMusic for musical pieces, and createAudioTransform for remixing. The async polling instruction also guides proper invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createAudioTransformAInspect

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

Credits: This endpoint consumes 3 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for remixing an audio sample (sound effect, ambiance or music) into a variation guided by a text prompt

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the 15MB size cap and the HTTP 400 failure mode, the allowed duration values, the credit hold/refund contract, and the async job shape ({id, status}) with polling guidance. The output's file format (.mp3 vs .wav) is also explained via the URL extension.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then constraints, then routing to siblings and polling guidance — every sentence carries operational information. It is dense and long, but no sentence is pure filler, so a 4 rather than a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested-payload async mutation tool with no output schema, the description covers input constraints, async lifecycle, credit semantics, result shape, and sibling routing. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains what modification_strength controls (0.6 default, departure from the original) and links request_id to the listGenerations (type audio) filter. It largely mirrors the schema's own text, so it stops short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Remix an existing audio sample ... into a variation guided by a text prompt') and explicitly distinguishes itself from the generation siblings (createSoundEffect, createAmbiance, createMusic). An agent can select it correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit when-to-use ('transform existing audio you already have') and names the three alternative tools plus the condition that selects them ('generate audio from scratch'). It also states the async workflow (poll getApiJob) and the optional request_id/listGenerations tagging pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createDirectionalSpritesAInspect

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 are where the camera stands around a character facing S (up to 8); every direction is rendered together, on the same frame size, scale and floor, so the sheets line up. Pick the style with listDirectionalSpriteStyles (style_id, and style_params for its settings) and check it with previewDirectionalSprites first. The job result is one sheet per direction, in the order asked, each with its spritesheet_url, grid fields, fps and render_3d. Credits are held for every direction when the job is accepted and charged for the sheets that come back; a failed or cancelled job is refunded. Pass an optional request_id to tag the sheets for later retrieval via listGenerations (type spritesheet). Async generation job: returns {id, status} - poll getApiJob (job and credit contract: see the server instructions).

Credits: This endpoint consumes 1 credit per direction (one sheet each).

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it discloses that credits are held for every direction on acceptance and charged only for returned sheets with refunds on failure/cancel, that it is an async job returning {id, status} to poll via getApiJob, and the result shape (one sheet per direction with spritesheet_url, grid fields, fps, render_3d).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and stays content-dense with almost no filler, though it is a long single paragraph that could be split for scannability. Every sentence still carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, annotation-free tool with no output schema, the description covers inputs, cross-tool prerequisites, async job contract, credit/refund behavior, and return payload — everything needed to invoke and follow up correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema property descriptions are rich for the nested fields, but the description adds relationship-level meaning the schema does not: the mutual exclusivity of animation_url/preset_id/model_animation, the rig requirements, and how directions render together on a shared frame/scale/floor. It largely complements rather than repeats the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb+resource+output: 'render a 3D model into one spritesheet per direction, in a style.' This clearly distinguishes it from createDirectionalStills (stills) and previewDirectionalSprites (preview) without needing the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to prerequisites and alternatives: use create3DModel with rig or rigModel for a rigged model, listDirectionalSpriteStyles to pick style_id, previewDirectionalSprites to check first, and the animate tools for animation_url/preset_id. It also states the 'at most one animation' exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createDirectionalStillsAInspect

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

Credits: This endpoint consumes 0.5 credits per direction (one image each).

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and does so well: it declares the async job contract (returns {id, status}, poll getApiJob), the credit lifecycle (held per direction at acceptance, charged for returned images, refunded on failure/cancellation), the 0.5 credits-per-direction cost, render-together ordering guarantees, and the rest-pose/no-animation constraint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and followed by parameters, workflow links, credit contract, and async contract in a logical order. It is dense and runs long, but nearly every clause carries operational information an agent needs; only the repeated credit restatement at the end is mildly redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description states the return shape (one image per direction, in requested order), the job envelope ({id, status}), and how to poll it. For a nested-body, async, credit-consuming tool with no annotations, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning beyond the field list: `directions` are 'rendered together so they line up' and returned 'in the order asked', `model` accepts a URL or base64 GLB, and `request_id` is described as a dedupe key and a listGenerations filter. The nested schema also documents these fields, so the description reinforces rather than rescues them; the per-direction credit cost is the main added semantic.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('render a 3D model as it is (no animation) into one large image per direction') plus the key modifiers: style and transparent background. It is immediately distinguishable from animation siblings (animate3DModel, animateSprite) and from previewDirectionalSprites, which it implicitly supersedes for actual generation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to listDirectionalSpriteStyles for valid styles, animateSprite for animation, editImage for editing, getApiJob for polling, and listGenerations for retrieval. It gives clear context for the surrounding workflow but never states when NOT to use this tool (e.g. previewDirectionalSprites as the cheaper dry run), so a sibling remains unaddressed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createImageAInspect

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

Credits: This endpoint consumes 0.5 credits per result.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for generating an image from text prompt

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly: it discloses async job nature (returns {id, status}), polling via getApiJob, credit hold/refund policy, per-result credit cost, and that n controls number of variations. It also notes no source image means no upload size limit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then proceeds logically through parameters, result format, credit behavior, and sibling alternatives. It is slightly dense but every sentence contributes useful information; minor tightening could improve readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a nested schema with 100% coverage, no output schema, and no annotations, the description supplies the missing operational context: async job contract, credit mechanics, request_id usage, and sibling differentiation. Nothing essential for correct invocation appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters in detail. The description repeats key parameters (n, image_type, art_style, perspective, aspect_ratio) but adds little syntactic or semantic detail beyond what the schema provides, meriting the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Generate) and resource (game-art images) and explicitly distinguishes itself from siblings by naming generateWithStyle, editImage, and removeBackground and their distinct purposes. An agent can immediately tell it creates new images from text rather than editing or stylizing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: 'Use createImage to make new images from scratch; use generateWithStyle to match a reference image's art style, editImage to modify an existing image, and removeBackground to cut out a subject.' Also instructs to poll getApiJob for async results.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createMusicAInspect

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

Credits: This endpoint consumes 3 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for generating music from a text description

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: async job semantics, credit hold/refund on failure or cancel, 3-credit cost, HTTP 400 on out-of-range duration, and result payload shape (URL whose extension indicates MP3 vs WAV). It even points to the server instructions for the job/credit contract.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and result shape, then constraints, then alternatives. Dense and mostly earned, though the duration enumeration and some parenthetical detail push it long enough that a tighter version would lose little.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an async, credit-consuming generation tool with a nested request body, the description covers result format, error behavior, cost, cancellation/refund, and the polling endpoint, deferring only the generic job contract to server instructions. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds behavioral meaning beyond the schema: the allowed duration values, that 0 means auto, and that out-of-range values return HTTP 400. The request_id tagging/lookup semantics are also reinforced, though augment_prompt is left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Produce a piece of music from a text description') with concrete examples, and explicitly distinguishes itself from three named siblings (createSoundEffect, createAmbiance, createAudioTransform). An agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('songs and musical scores') and when-to-use-something-else, naming each alternative and its domain. Also documents the optional request_id + listGenerations lookup workflow and the async poll path via getApiJob.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createSoundEffectAInspect

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

Credits: This endpoint consumes 2 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for generating a sound effect from a text description

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full burden and does so: it discloses the credit-hold and refund-on-failure/cancel policy, the 2-credits-per-call cost, and the async contract (returns {id, status}, poll getApiJob). This is well beyond what the schema conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and output format are front-loaded before routing and job/credit details. Some sentences (the sibling routing run-on, the request_id clause) are dense, but nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description explains the return shape (audio URL, MP3 vs WAV by extension), the async job envelope, and how to poll. Combined with annotations absent, everything an agent needs to call and follow up is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description restates duration cap/0-semantics and loop behavior that the schema already documents, and its request_id note (locating via listGenerations) largely mirrors the schema text, adding little new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Produce a short sound effect from a text description') with concrete examples, and explicitly distinguishes itself from createAmbiance, createMusic, and createAudioTransform. An agent can pick it out without reading any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit use condition ('short, discrete sounds') and names three sibling alternatives with the condition that selects each (ambiance = continuous looping background, music = musical pieces, audio transform = remix an existing sample). Routing is fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createSpeechInspect

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

Credits: This endpoint consumes 2 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for text-to-speech generation using voice cloning
createSpeechPresetInspect

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

Credits: This endpoint consumes 1 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for text-to-speech generation using a voice preset
createSpriteAudioAInspect

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

Credits: This endpoint consumes 3 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for generating audio for a previously generated spritesheet animation.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so well: it discloses the async job contract ({id, status}), the need to poll getApiJob, the 3-credit cost, idempotency behavior, the 7-day input validity window, attachment of audio to the spritesheet, and that only an audio URL is returned. It also explains how the result surfaces later as audio_url in listGenerations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loads the purpose, then layers usage rules, behavioral contract, and credit cost in a logical order. It is dense and mostly earns its length, though some schema-covered constraints are repeated and could be trimmed without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex async generation tool with no annotations and no output schema, the description covers every element an agent needs: valid input source, optional parameters, idempotency, job polling, return shape, cost, and downstream visibility. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the nested requestBody, spritesheet_video_url, prompt, and request_id. The description mostly repeats those constraints, adding only a minor clarification that request_id must not have been used for another generation; it does not add enough beyond the schema to lift the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Generate a sound effect for a previously generated spritesheet animation.' It immediately distinguishes this from general sound-effect tools by tying the input to a specific spritesheet video URL, and names the sibling tools that produce that input.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not-to-use guidance: only call for forge / forge-pixel output or to replace hydra's sound, because hydra spritesheets already include audio_url. It also rules out arbitrary external videos, leaving no ambiguity about valid invocations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createVideoAInspect

Generate a short video clip from a source image and a motion text prompt (image-to-video); a source image is required - to make a video from text alone, first createImage and animate that, or use createVideoFromReferences with reference images. Griffin (default, 480p) and Griffin HD (720p) both generate a soundtrack; no separate audio step is needed. The job result is the video URL and its actual duration in seconds. Optionally pass final_image to interpolate between a start and end frame. The chosen model and duration must be compatible (incompatible combinations return HTTP 400); see the model and duration fields for the values each model accepts. Credits are held when the job is accepted; the final charge is rate × produced seconds, never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type video). Related tools: use createImage for static images, animateSprite for sprite-sheet animation, and listGenerations (type video) to list videos you generated earlier. Async generation job: returns {id, status} - poll getApiJob (job and credit contract: see the server instructions).

Credits: credits/s × seconds, per model: Griffin 1.5/s (shortest duration 5s, so 7.5 credits minimum), Griffin HD 2/s (shortest duration 5s, so 10 credits minimum), Blitz 1/s (shortest duration 2s, so 2 credits minimum) [LEGACY], Eagle 1.3/s [LEGACY], Eagle with Audio 1.8/s [LEGACY]; [LEGACY] models are scheduled for removal - do not use them for new work; see this endpoint's full pricing table in the API docs.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for generating a video from a source image and motion prompt

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so: it discloses the async contract (`{id, status}`, poll getApiJob), the credit hold/refund policy (never charged more than requested duration, full refund on failure or cancellation), the HTTP 400 incompatibility failure mode, that audio is bundled with no separate step, and the actual return values (video URL and produced duration).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the image requirement, then alternatives, then behavior. It is dense but mostly earns its length; the per-model credit/shortest-duration list duplicates the `model` field description verbatim and could be dropped without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested-request async generation tool with no output schema, the description supplies everything needed: required input, compatibility constraint, job lifecycle, polling target, cost model, refund behavior, and the shape of the result (video URL plus duration).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so a 3 is the baseline; the description earns above that by adding cross-parameter semantics the schema cannot express, notably that `model` and `duration` must be compatible or the call returns HTTP 400, and that `request_id` doubles as a listGenerations filter. It otherwise largely restates what the schema fields already document, including the per-model credit table.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Generate a short video clip from a source image and a motion text prompt') and immediately distinguishes itself from siblings by naming createImage and createVideoFromReferences as the paths for text-only or reference-based generation. An agent can tell this apart from animateSprite and editVideo without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use and when-not-to-use: a source `image` is required, and if the agent has only text it is told to call createImage first or switch to createVideoFromReferences. It also enumerates related tools (createImage, animateSprite, listGenerations) with the condition that selects each.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createVideoFromReferencesAInspect

Generate a video from 1-5 reference images and a text prompt (references-to-video). Unlike createVideo, which animates a single source image, this composes a new scene that borrows characters, objects, and style from the reference images. Each image can be a URL or base64. Griffin (default, 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 its actual duration in seconds. Choose the output shape with aspect_ratio ("default" lets the model decide). The chosen model and duration must be compatible (incompatible combinations return HTTP 400). Credits are held when the job is accepted; the final charge is rate × produced seconds, never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type video). Related tools: createVideo for image-to-video, editVideo to modify a generated video. Async generation job: returns {id, status} - poll getApiJob (job and credit contract: see the server instructions).

Credits: credits/s × seconds, per model: Griffin 2.5/s (shortest duration 5s, so 12.5 credits minimum), Griffin HD 4/s (shortest duration 5s, so 20 credits minimum), Eagle 1.5/s [LEGACY], Eagle with Audio 2/s [LEGACY]; [LEGACY] models are scheduled for removal - do not use them for new work; see this endpoint's full pricing table in the API docs.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for generating a video from 1-5 reference images and a text prompt.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden and does so well: async job contract ('returns {id, status}', poll getApiJob), credit hold/refund semantics including failure and cancellation, HTTP 400 on incompatible model+duration, and higher per-second rate than createVideo. This is far more than the schema conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and sibling differentiation are front-loaded, and the pricing/credit paragraph carries real decision value. However, the per-model credits/s line duplicates the schema's model enum descriptions almost verbatim, which is the one segment that does not earn its space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested, async, credit-metered generation tool with no output schema, the description supplies the return contract (video URL + actual duration), the polling path, and the cost model, so an agent has everything needed to invoke and follow up correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each parameter (model, images, duration, request_id, aspect_ratio) is already fully documented with enums, defaults, and examples. The description largely restates this ('Choose the output shape with aspect_ratio', request_id tagging via listGenerations) and adds little syntax or format detail beyond it, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+modality ('Generate a video from 1-5 reference images and a text prompt (references-to-video)') and immediately contrasts it with createVideo ('which animates a single source image'), making the boundary unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Related tools: createVideo for image-to-video, editVideo to modify a generated video,' and states the distinguishing condition (composing a new scene vs animating one image). When-to-use and the alternatives are both named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createVoiceInspect

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

Credits: This endpoint consumes 2 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for generating a voice sample from a character description and/or a character image
editImageAInspect

Modify an existing image according to text instructions: supply a source image (URL or base64) and a prompt describing the changes (e.g. "add clouds", "warmer color scheme"), with an optional reference_image for extra style or content guidance. The job result is an array of image results, each with a url; request n (1-4) to control the number of edited variations. Provided images are uploaded and validated, and any image larger than 15MB is rejected with HTTP 400. Credits are held when the job is accepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use editImage to transform a specific existing image; use createImage to generate from text alone, generateWithStyle to borrow a reference's art style, and removeBackground for the dedicated background-removal case. Pass an optional request_id to tag the results so you can retrieve them later via listGenerations (type image). Async generation job: returns {id, status} - poll getApiJob (job and credit contract: see the server instructions).

Credits: This endpoint consumes 0.5 credits per result.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for editing an existing image based on text instructions

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden and does so richly: upload/validation behavior, the 15MB rejection with HTTP 400, credit-hold/refund semantics, charge scaling with output count, and the async job contract ('returns {id, status}', poll getApiJob). This is exactly the behavioral detail a write/generation tool needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded (core action first, then parameters, then alternatives, then job contract and credits). It is long but nearly every sentence carries routing, behavioral, or contract information; only minor tightening is possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex nested-object generation tool with no output schema, the description covers inputs, alternatives, return shape, polling, credit contract, and an error case. An agent has everything needed to call it and handle the async result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: n controls edited variations, request_id tags results retrievable via listGenerations, reference_image supplies style/content guidance, and augment_prompt's behavioral caveat. It goes beyond restating field labels.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Modify an existing image according to text instructions') and immediately distinguishes itself from named siblings createImage, generateWithStyle, and removeBackground. An agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the when-to-use condition ('transform a specific existing image') plus a contrast against three alternative tools with their own use conditions. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

editSpritesheetInspect

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

Credits: edit_mode "fix_loop" / "outpaint": 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 - credits/s × seconds, per model: Hydra 3/s, Forge 2/s, Forge Pixel 2/s; see this endpoint's full pricing table in the API docs.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for editing a previously generated spritesheet. edit_mode selects the operation - prompt-driven edit (default), outpaint, loop fixing, or improve (finer detail, on hydra spritesheets only).
editVideoAInspect

Edit a previously generated video with a 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, createVideoFromReferences, or an earlier edit - it must be a video you generated within the last 7 days; arbitrary external videos are not accepted. Optionally add up to 5 reference images (URL or base64) to guide the edit. The job result is the new video URL and its actual duration in seconds. Credits are held when the job is accepted; the final charge is rate × produced seconds, never more than for the duration you requested, and the difference (or everything, if the job fails or is cancelled) is refunded. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type video). Related tools: createVideo to generate the source clip, createVideoFromReferences for reference-driven generation. Async generation job: returns {id, status} - poll getApiJob (job and credit contract: see the server instructions).

Credits: credits/s × seconds, per model: Griffin HD 2/s, Eagle 2/s [LEGACY]; [LEGACY] models are scheduled for removal - do not use them for new work; see this endpoint's full pricing table in the API docs.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for editing a previously generated video with a text prompt and optional reference images.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the async job contract ({id, status} + polling getApiJob), the 7-day source constraint, the duration inheritance rule, and the credit hold/refund mechanics including the failure and cancellation cases. This is exactly the behavioral context an agent needs for a mutation job.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and input constraints, and every clause is informative. However, the trailing credits paragraph duplicates pricing/legacy-model information already present in the schema's model description, adding some redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an async generation job with no output schema, the description supplies the return shape (new video URL and actual duration), the polling path, and the billing contract. Nothing essential to invoking or interpreting the job is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description nonetheless adds real meaning beyond the schema, notably that output duration follows the source unless a duration is supplied and that reference images guide the edit. The maxImages and request_id semantics largely restate the schema descriptions, keeping it out of the top band.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (edit) and resource (previously generated video) plus the modality (text prompt + optional reference images, video-to-video), and names the sibling tools that produce acceptable inputs (createVideo, createVideoFromReferences). An agent can distinguish this from createVideo/createVideoFromReferences without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the precondition (the video must be one you generated in the last 7 days; arbitrary external videos are rejected), points to the related generation tools, and names the alternative paths. Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generatePoseAInspect

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

Credits: This endpoint consumes 0.5 credits per result.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for generating a new pose for an existing sprite

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and discloses async job semantics ({id, status} return, poll getApiJob), credit mechanics (held then refunded, 0.5 credits per result), and the shape of the result array (image url, pose, description, suggested motion_prompt). This is exceptionally complete for a creation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and dense with relevant detail; nearly every sentence earns its place. It is somewhat long, but the length is justified by the async, credit, and workflow context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description describes the return value and async polling pattern; credits, constraints, and sibling workflow are all covered. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the schema already documents all nested parameters. The description repeats the key params (image URL/base64, pose, n=1-4) and adds little beyond that, though it confirms request_id ties to listGenerations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Re-pose an existing sprite into a new target pose while preserving the character') and distinguishes it from siblings by naming animateSprite and rotateSprite as adjacent steps. An agent can select it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states constraints ('Only works with sprite image types (not icons, screenshots, etc.)') and workflow placement ('typically the first step before animating'), plus a direct alternative ('use rotateSprite instead when you want to change the camera angle'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generateWithStyleAInspect

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

Credits: This endpoint consumes 0.5 credits per result.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for generating new content while maintaining the visual style of a reference image

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: upload/validation of style_image, 15MB rejection with HTTP 400, credit hold on accept and refund on failure/cancel, charge scaling with images produced, and the async `{id, status}` return contract. This is unusually rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and inputs, then the async/credit contract. It is long and slightly redundant with the schema's parameter descriptions, but nearly every sentence adds operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description still specifies the return shape (`{id, status}`) and the polling path, plus credit semantics and the upload size limit. Given the nested requestBody and single-parameter signature, nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3, but the description adds cross-tool meaning the schema lacks: request_id tags results for later listGenerations(type image) retrieval, and n (1-4) controls variations. Some overlap with schema text (style_image URL/base64, image_type default) keeps it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('generate new images that match the visual style of a reference image') and immediately names the key inputs. It is distinguishable from createImage, editImage, and removeBackground, which are all named and contrasted.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: use this instead of createImage when style consistency matters, use editImage to alter content, and removeBackground to isolate a subject. It also tells the agent to poll getApiJob for the async result and mentions listGenerations for retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getAccountAInspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so well: it states this is a 'free read-only lookup (no credits, no generation)' and explains team_pool and auto_topup null behavior, which is not inferable from the tool name or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet information-dense, leading with the core purpose and then adding only necessary details: field semantics, team-pool behavior, a direct usage trigger, and the billing URL. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, no annotations, and zero parameters, the description is remarkably complete: it explains return values, edge-case behavior, cost implications, and the correct workflow. An agent can safely invoke this tool without guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters)Skip, so the description appropriately requires no parameter explanation. The baseline for a zero-parameter tool is 4, and the description does not need to compensate for any schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Show') and resource ('your account's credit balance, plan and auto top-up settings'), and names the exact fields returned. It is clearly distinguishable from the generative sibling tools because it describes a read-only account lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use the tool: 'Check this before an expensive generation instead of waiting for a 402.' It also tells the agent when not to use it for billing actions, directing those to the web app at billing_url.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getApiJobAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe job id returned by a generation call (its `id` in the 202 response).
waitNoSeconds to long-poll for a terminal state (0-60). Defaults to 0 (return immediately).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does it well: it reveals polling semantics, terminal states (succeeded/failed), result/error fields, blocking behavior up to wait seconds, and early return on completion. Minor omission: no mention of authentication, rate limits, or behavior for unknown ids, but core runtime behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences with no filler: action, workflow, and polling strategy are each front-loaded in their sentence. Every clause earns its place, and the parenthetical limits are efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema or annotations, the description explains the full call contract: when to poll, what statuses indicate completion, how to read result/error, and how long a wait may block. For a simple two-parameter polling tool, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so a baseline of 3 applies, but the description adds real value: it ties id to the id returned by generation calls and explains the wait parameter's long-polling effect and default return behavior. This exceeds the schema's bare parameter definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource pair, 'Poll the status of a generation job', and explains the job lifecycle with {id, status}. This clearly differentiates it from sibling tools like cancelApiJob and listApiJobs, which deal with cancellation and listing rather than status polling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to call this tool: after any generation tool returns {id, status}, poll until terminal. It also gives polling cadence and long-poll guidance. It does not explicitly contrast with siblings (e.g., when to prefer listApiJobs or cancelApiJob), but the intended usage is unmistakable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getDocsAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
docNoWhich document to read, by id (the table of contents returned by the no-parameter call lists them). Omit to receive the table of contents.
sectionsNoSection 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 matched whole). Matching ignores case, spacing and punctuation; titles that match nothing are reported back in `unmatched_sections` rather than guessed at. Only valid together with `doc`. Omit to return every section of the document.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and executes excellently. It discloses the read-only and free nature ('does not charge credits and does not queue a job'), the exact response structure for the no-parameter call, partial-match behavior via 'unmatched_sections' and 'available_sections', the 400 error with valid values for retries, the case/spacing/punctuation-insensitive matching semantics, and the size warning about tens of thousands of characters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense, with every sentence earning its place: what the tool does, sibling differentiation, a content-parity caveat, the browse workflow, a size warning, matching/error semantics, and cost behavior. It is front-loaded with purpose before details, and the structure flows logically from overview to edge cases.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no annotations, so the description must explain return values, cost, and failure modes on its own — and it does. It covers the TOC structure (id, label, section titles, no bodies), partial and total failure responses, how to retry once, and the fact that this endpoint costs nothing and queues no job. An agent has everything needed to invoke it correctly across all edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuinely useful semantics beyond the schema: that the no-parameter call returns a table of contents listing document ids, that sections should be copied from that TOC, that sections is only valid together with doc, and the REST comma-separated string caveat. It also explains the fallback behavior when titles don't match, which the schema does not address.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Browse or read Ludo's own documentation in full' and enumerates concrete use cases. It explicitly distinguishes itself from the sibling searchDocs by contrasting behaviors ('To answer a specific question, call searchDocs first' vs 'Use getDocs to see what documentation exists, or to read a whole document or named sections').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance, naming the alternative tool and the condition that selects it: 'To answer a specific question, call searchDocs first'. It also provides a concrete invocation workflow (call with NO parameters for the table of contents, then re-call with doc/sections) and a practical rule about preferring named sections over whole-document fetches.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listAnimationPresetsAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description must carry the behavioral load, and it does well: it discloses the synchronous GET with no request body, that it is a free discovery endpoint that charges no credits, and the exact return shape. It stops short of auth requirements or rate-limit behavior, but the cost and call-mechanics disclosures are meaningful additions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what is listed and the call mechanics, with no filler sentences. It is on the dense side, packing the full return contract into one paragraph, but since no output schema exists every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema present, the description supplies the return contract (animations array fields, perspectives array, directions list) and the caller's downstream routing. For a zero-param discovery endpoint this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. The description correctly conveys that no inputs are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List the available animation presets') and enumerates exactly what the response contains, including the eight compass directions. An agent can distinguish this discovery tool from the animation siblings it names without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('to obtain the preset_id, perspective, and direction values that transferMotion needs') and names three concrete alternative consumers (transferMotion, animateSprite, animate3DModelPreset) with the scenario each fits. Nothing about routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listApiJobsAInspect

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

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

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility. It explicitly says this is a 'free read-only lookup (no credits, no generation)', discloses ordering, defaults, and the limit cap. This is strong transparency for a safe read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, each earning its place: scope and ordering, safety and cost, then filtering and limit behavior. No filler or redundant detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list operation with two optional parameters and no output schema, the description covers everything needed: scope, order, exclusions, read-only nature, filter syntax, default limit, and cap. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description repeats the comma-separated status behavior and the 50/100 limit without adding new parameter-level meaning, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), a specific resource ('generation jobs' started through API/MCP), and ordering ('most recent first'). It also excludes web-app jobs, which clearly distinguishes it from getApiJob and listGenerations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for when the tool applies: listing API/MCP-started generation jobs, not web-app jobs. It does not explicitly name alternatives like getApiJob or listGenerations, but the scope is precise enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listDirectionalSpriteStylesAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so well: it discloses that the endpoint is free/does not charge credits, and it enumerates the returned fields (id, label, description, family, pixel-art flag, thumbnail_url, version, settings and advanced_settings). It does not mention auth requirements or rate limits, so it falls just short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then the return shape, then the usage guidance. The field enumeration is dense but earns its place because there is no output schema. Slightly long, but no redundant sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no annotations exist, so the description must cover return values and behavior; it describes the returned fields and the settings structure in detail and states the free/cost behavior. Nothing an agent needs to call this no-arg discovery tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which sets the baseline at 4. The description still adds useful cross-tool semantics by explaining that each style's id is 'passed as style_id' and that setting names are 'the key in style_params', clarifying how the output maps onto other tools' inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'List the styles Directional Sprites can render a 3D model in, with the perspectives (camera heights) and the eight directions.' It also names the sibling tools it feeds (previewDirectionalSprites, createDirectionalSprites, createDirectionalStills), so an agent can distinguish it from the create/preview siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes usage: 'Free discovery endpoint: it does not charge credits. Use it before previewDirectionalSprites, createDirectionalSprites and createDirectionalStills.' This tells the agent both the cost profile and the correct ordering relative to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listGenerationsAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesWhich kind of generation to list
searchNoFree-text search. Every whitespace-separated term must match (case-insensitive substring) the item's tags or one of its text fields (prompt, hints, style, label, ...), so "dwarf axe" narrows to items matching both.
sourceNoWhich surface the items were generated from: api (your API/MCP generations, last 7 days only), web (your Ludo web studio generations, no time limit), or all (default, both) Default: "all".
date_toNoOnly return items generated at or before this time (unix seconds)
date_fromNoOnly return items generated at or after this time (unix seconds)
page_sizeNoItems per page (1-100) Default: 20.
request_idNoOnly return items tagged with this request_id when you generated them
page_numberNo1-based page number Default: 1.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the pagination contract (has_more-driven paging), output shape, and the 7-day expiration of API-originated results. It does not mention sorting or error behavior, but the disclosed behaviors are substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Each sentence earns its place: scope/filters, pagination protocol, retention warning, and alternative routing. It is front-loaded with the core purpose and contains no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema and no annotations, the description tells the agent what the response looks like, how to page through results, that results may expire, and which sibling tool to use for a different need. That is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's first sentence summarizes filter capabilities but does not add meaning beyond the schema. The only meaningful extra information is the pagination/output shape, which is behavior rather than parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: listing generation history across API and web app. It also gives the exact filtering dimensions (type, source, text, date), making the tool's scope immediately identifiable and distinct from job-status tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly routes in-flight job status checks to getApiJob instead, and it warns that API-originated results expire after 7 days so the agent knows when to download. This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

previewDirectionalSpritesAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers: synchronous call (not a job), free/no credits, nothing written to generations, frame images retained 7 days, several-second latency, and single-flight concurrency where a new preview cancels the running one and it answers 204 with no body. That is exactly the behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then response shape, then cost/retention, then concurrency caveat, then guidance — a sensible order with no filler. Mild redundancy between the opening 'check a style before rendering' and the closing 'render only once the look is right' keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description fully covers the return shape (one preview per direction in the order asked, each with frame_urls and render_3d, the latter feeding straight back into createDirectionalSprites). Cost, retention, timing, and concurrency edge cases are all present, so nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Individual field docs live in the nested schema, but the description adds real cross-tool semantics by stating it takes the same model/animation/camera/style fields as createDirectionalSprites, and explains how input translates to output (4 frames for an animated model vs 1 for a still). It stops short of covering defaults or per-field constraints for directions, style_params, and size parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (preview Directional Sprites) plus scope: a few frames of a 3D model in a style, from each requested direction, to vet a style before rendering. It explicitly positions itself relative to createDirectionalSprites, so an agent can tell the two apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The closing line gives direct when-to-use guidance: preview one or two directions while iterating on styles, then render with createDirectionalSprites only once the look is right. The alternative tool is named and the condition that selects it is explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

removeBackgroundAInspect

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

Credits: This endpoint consumes 0.5 credits per result.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for removing the background of an image

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations or output schema, the description carries the full burden and fully delivers. It discloses async job behavior, polling via getApiJob, the single-image URL result, upload validation, a 15MB HTTP 400 rejection, credit holding/refunding, and the 0.5 credits per result cost. There is no contradiction with any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place: purpose, parameter guidance, output shape, error behavior, credit handling, sibling routing, and async polling. It is front-loaded with the core purpose and structured so an agent can quickly extract the key call semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with nested requestBody, async execution, no output schema, and no annotations, this description covers all essential operational details: how to supply the image, what the result looks like, how to retrieve it, failure behavior, and cost. Nothing critical for correct invocation is left unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents all parameters at 100% coverage, the description adds meaningful guidance beyond the schema: creative_edit's pixel-identity tradeoff, request_id's role in retrieving results via listGenerations, and crop's trimming behavior. This gives the agent practical decision-making information rather than just schema repetition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Remove the background from a single image, returning the subject isolated on a transparent background.' It also explicitly contrasts this tool with editImage, createImage, and generateWithStyle, so an agent can distinguish it from relevant siblings without guessing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It says 'Use removeBackground for this dedicated cutout task' and names editImage as the alternative for broader edits, plus createImage/generateWithStyle as generation-only tools. It also gives a concrete condition: set creative_edit false when the subject must stay pixel-identical, e.g., an existing sprite.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rigModelInspect

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

Credits: This endpoint consumes 1 credits per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYes
rotateSpriteAInspect

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

Credits: This endpoint consumes 0.5 credits per result.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for rotating the camera view of an existing sprite

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it discloses the credit contract (held on accept, refunded on failure/cancel, scaling with image count), the async job pattern and polling requirement via getApiJob, the result shape, and the input-type restriction. That is well beyond what the schema conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and constraint, and every sentence carries information (params, restriction, credit behavior, alternatives, async contract). It is dense and runs long as one block, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description correctly supplies the return contract: an array of results each with image url plus applied camera_rotation/camera_elevation, and the async `{id, status}` envelope with polling via getApiJob. Combined with the type restriction and credit notes, an agent has everything needed to invoke and follow up.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the nested schema already documents n, image, request_id, augment_prompt, camera_rotation, and camera_elevation with examples and value lists. The description largely restates these (rotation azimuth list, elevation values, omit-to-keep-elevation), adding no syntax or format beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Re-render an existing sprite from a different camera viewpoint') and immediately constrains scope (keeps same character and pose, sprite image types only). It explicitly distinguishes itself from generatePose, animateSprite, and transferMotion, so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use plus named alternatives with the condition that selects each: 'use generatePose instead to change the character's pose rather than the camera, and animateSprite or transferMotion to bring a sprite to life.' Also states the negative constraint that it only works on sprite image types, not icons or screenshots.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rotateSpritesheetInspect

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

Credits: Cost varies by model and duration (credits/second × duration).

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for re-rendering a previously generated sprite animation from a new view.
searchDocsAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoMaximum number of sections to return. Defaults to 3.
queryYesWhat you want to know, in plain language, e.g. "how do I keep a sprite animation's colors consistent" or "what does a 3D model cost".

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and handles it thoroughly: weak matches are omitted, empty results mean the documentation doesn't cover the question, results include doc/section/full markdown, 503 means the backend is unavailable, and the endpoint is free and does not queue a job. It also flags that the docs occasionally describe buttons rather than parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but appropriately packed with necessary behavioral and fallback information. It is front-loaded with purpose and actionable guidance, though a few clauses are slightly redundant ('Start here rather than reading whole documents' restates the fastest-way point).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description fully explains return shape (doc, section, content), ordering, empty results, n defaults, and error fallback. An agent has everything needed to invoke the tool correctly and interpret the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces that query is a plain-language question and n caps the number of sections, but it does not add meaningful parameter semantics beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Search') and resource ('Ludo's own documentation'), and explains the search is question-driven and returns only the few sections that answer it. It clearly differentiates from getDocs by saying results carry doc/section identifiers to pass to getDocs for re-reading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent when to start here ('before you generate', 'Start here rather than reading whole documents') and what to do when results are empty or the backend returns 503, including naming getDocs as the fallback. This is direct and actionable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submitApiFeedbackInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYes
transferMotionAInspect

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

Credits: credits/s × seconds, per model: Hydra 3/s, Forge 2/s, Forge Pixel 2/s, 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for transferring motion from a video onto a static sprite image, producing an animated spritesheet.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so richly: precedence rule (video wins over preset), specific HTTP 400 failure conditions, credit hold/refund semantics, async job contract ({id,status} + poll getApiJob), and legacy-model deprecation warning. This is far beyond a minimal restatement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but dense and front-loaded, with the core action and inputs leading. Nearly every sentence adds a rule (precedence, defaults, errors, credits), though the credit/pricing block is somewhat redundant with the schema's model descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex async generation tool with a deeply nested schema, it covers inputs, precedence, duration/model defaults, error cases, credit lifecycle, and polling workflow, and names the sibling alternative. Nothing essential to invoking it correctly is missing; there is no output schema to explain, and it still summarizes the result fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the required preset_id/perspective/direction triple, that video overrides preset, that duration defaults to 1.5s otherwise the model's shortest (hydra 3s), and that preset timing should be preserved by passing its own duration.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+outcome: transferring motion from a video or preset onto a static sprite to produce an animated spritesheet. It explicitly distinguishes from its sibling animateSprite (text-prompt generation) and names the preset source (listAnimationPresets), so an agent can place it precisely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit condition ("Use this when you have an existing motion clip or preset to copy") plus a named alternative with the counter-condition ("prefer animateSprite to generate animation purely from a text prompt"). Model-selection guidance (omit model for hydra, forge for cheaper/simple motion) further routes the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upscaleImageAInspect

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

Credits: This endpoint consumes 0.5 credits per result.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for upscaling an image

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so richly: 2048px source cap and 15MB limit both rejected with HTTP 400, 4x ceiling, single-url (not array) result shape, credit hold/refund semantics, 0.5 credit cost, and the async job contract returning {id, status} to be polled via getApiJob.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and limits are front-loaded, and nearly every sentence carries distinct constraints or routing info. It is on the long side, with some repetition of schema-documented request_id behavior, but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema and no annotations, the description supplies the return shape, polling path, failure modes, cost, and credit lifecycle. An agent has everything needed to invoke and follow up correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both image and request_id are already documented in the schema. The description adds the 2048px constraint and the listGenerations retrieval angle, but this largely overlaps the schema text, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Upscale an image') with concrete scope: up to 4x, capped at 2048px on the longest side. It also explicitly distinguishes itself from siblings createImage and editImage, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use ('raise the resolution of an image you already have') plus named alternatives with their differing purpose ('createImage and editImage make new or changed images instead'). Nothing is left to inference about tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upscaleVideoAInspect

Upscale a previously generated video to twice its resolution (2x). Pass the video url you received from createVideo, createVideoFromReferences, or editVideo - it must be a video you generated within the last 7 days; arbitrary external videos are not accepted. Both dimensions of the source must be under 960 pixels: griffin (480p) output qualifies; griffin-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 of model; held when the job is accepted and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type video). Related tools: createVideo for image-to-video, editVideo to modify a generated video. Async generation job: returns {id, status} - poll getApiJob (job and credit contract: see the server instructions).

Credits: 0.2 credits per second of video.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestBodyYesPayload for upscaling a previously generated video to twice its resolution.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are none, so description carries full burden. It discloses async behavior (returns {id, status}), polling via getApiJob, credit billing per second, refund on failure/cancellation, and the result format (new URL and duration). It mentions credit hold and refund policy. It doesn't detail error handling or retry behavior, but covers main behaviors. No contradictions with annotations (none provided).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is thorough and well-organized, but somewhat dense and lengthy. It front-loads key info (upscale to 2x, use generated videos) but includes multiple clauses and parentheticals (e.g., 'landscape or portrait (only a square 720x720 would)') that could be simplified. Still, every sentence adds value, and it's not bloated with fluff. A 4 for efficient but slightly overloaded structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations or output schema, description provides comprehensive context: input constraints, billing, async nature, polling method, result format, and relationship to siblings. It even includes credit cost (0.2 credits/sec). An agent has everything needed to call and interpret the tool correctly, including failure/refund behavior. Very complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. Description adds value by explaining the video parameter's constraints (7-day, model-specific) and the request_id semantics (idempotency, listGenerations filter). This goes beyond schema, but since schema already covers these, the addition is moderate, not exceptional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states action ('upscale a previously generated video'), resource (video url), and specific effect (2x resolution). It explicitly differentiates from siblings by mentioning createVideo, editVideo, and related tools, and is specific about input constraints (7-day old, 480p vs 720p). No ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: pass a URL from specific generation tools, ensure source is under 960 pixels, use griffin for generation if upscaling is intended. Clearly states what is NOT accepted (external videos, griffin-hd outputs except square). It doesn't explicitly list alternatives for when not to use, but it thoroughly covers conditions and prerequisites, making it easy for an agent to decide correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validateApiKeyEndpointAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It does disclose the success/error status codes, which is useful, but it fails to explain how the API key is supplied (since the schema has zero params) or mention any potential side effects. The 200/403 detail is valuable but the input mechanism remains opaque.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one efficient sentence that conveys the core purpose and expected responses with zero waste. It is ideally concise and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with no schema, annotations, or output schema, the description covers the essential purpose and responses. The only gap is the lack of explanation on how the API key is provided, but given the zero-parameter design, this is likely handled externally, making the description largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4. The description identifies the subject (API key) but does not clarify how the key is transmitted, given the empty schema. However, since no parameters are expected, the description does not need to detail parameter values; still, a note about implicit authentication context would improve it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'validates' and the resource 'API key', clearly stating what the tool does. It also provides distinct status codes (200/403) that set it apart from sibling tools, which are all media-related.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates this is for checking API key validity, but it does not explicitly state when to use it or mention any alternatives. Given that all sibling tools are unrelated, some contextual guidance on when to invoke validation would be helpful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updates
    • Changedcreate3DModel3 fields changed
      • addedInput schema / properties / requestBody / properties / joint_naming
        Added value: +{
        +  "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"
        +}
      • addedInput schema / properties / requestBody / properties / rig
        Added value: +{
        +  "description": "Also rig the model (skeleton 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 back rigged (the result's rigged). Default: false.",
        +  "example": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / requestBody / properties / rig_type
        Added value: +{
        +  "description": "With rig, which skeleton to build (as rigModel's rig_type). humanoid_template (default, 22 joints) and humanoid_template_hands (52, five fingers per hand) are the ones animation presets and createDirectionalSprites' preset_id need, and only suit two-armed, two-legged characters; use general for creatures and objects. Default: \"humanoid_template\".",
        +  "enum": [
        +    "general",
        +    "humanoid",
        +    "game",
        +    "humanoid_template",
        +    "humanoid_template_hands"
        +  ],
        +  "example": "humanoid_template",
        +  "type": "string"
        +}
    • AddedcreateDirectionalSprites
    • AddedcreateDirectionalStills
    • AddedlistDirectionalSpriteStyles
    • AddedpreviewDirectionalSprites
    • AddedupscaleImage
  2. 3 tool updates
    • ChangedcreateSpeech3 fields changed
      • addedInput schema / properties / requestBody / properties / delivery
        Added value: +{
        +  "description": "How the line is said, e.g. \"angry, shouting\" or \"whispering, out of breath\" (max 50 characters).",
        +  "maxLength": 50,
        +  "type": "string"
        +}
      • changedInput schema / properties / requestBody / properties / text / description
        Previous value: -"Text to convert to speech (max 1000 characters)."New value: +"Text to convert to speech (max 250 characters)."
      • changedInput schema / properties / requestBody / properties / text / maxLength
        Previous value: -1000New value: +250
    • ChangedcreateSpeechPreset8 fields changed
      • addedInput schema / properties / requestBody / properties / delivery
        Added value: +{
        +  "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"
        +}
      • changedInput schema / properties / requestBody / properties / emotion / description
        Previous value: -"Emotion to apply to the speech."New value: +"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."
      • changedInput schema / properties / requestBody / properties / language / description
        Previous value: -"Language code for the speech."New value: +"Language of the speech. Each voice family supports its own list of languages; \"auto\" detects it from the text."
      • changedInput schema / properties / requestBody / properties / language / enum
        Previous value: -[
        -  "auto",
        -  "English",
        -  "Afrikaans",
        -  "Arabic",
        -  "Bulgarian",
        -  "Catalan",
        -  "Chinese",
        -  "Chinese,Yue",
        -  "Croatian",
        -  "Czech",
        -  "Danish",
        -  "Filipino",
        -  "Finnish",
        -  "French",
        -  "German",
        -  "Greek",
        -  "Hebrew",
        -  "Hindi",
        -  "Hungarian",
        -  "Indonesian",
        -  "Italian",
        -  "Japanese",
        -  "Korean",
        -  "Malay",
        -  "Norwegian",
        -  "Nynorsk",
        -  "Persian",
        -  "Polish",
        -  "Portuguese",
        -  "Romanian",
        -  "Russian",
        -  "Slovak",
        -  "Slovenian",
        -  "Spanish",
        -  "Swedish",
        -  "Tamil",
        -  "Thai",
        -  "Turkish",
        -  "Ukrainian",
        -  "Vietnamese"
        -]New value: +[
        +  "auto",
        +  "English",
        +  "Afrikaans",
        +  "Arabic",
        +  "Bulgarian",
        +  "Catalan",
        +  "Chinese",
        +  "Chinese,Yue",
        +  "Croatian",
        +  "Czech",
        +  "Danish",
        +  "Filipino",
        +  "Finnish",
        +  "French",
        +  "German",
        +  "Greek",
        +  "Hebrew",
        +  "Hindi",
        +  "Hungarian",
        +  "Indonesian",
        +  "Italian",
        +  "Japanese",
        +  "Korean",
        +  "Malay",
        +  "Norwegian",
        +  "Nynorsk",
        +  "Persian",
        +  "Polish",
        +  "Portuguese",
        +  "Romanian",
        +  "Russian",
        +  "Slovak",
        +  "Slovenian",
        +  "Spanish",
        +  "Swedish",
        +  "Tamil",
        +  "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"
        +]
      • changedInput schema / properties / requestBody / properties / text / description
        Previous value: -"Text to convert to speech (max 1000 characters)."New value: +"Text to convert to speech (max 250 characters)."
      • changedInput schema / properties / requestBody / properties / text / maxLength
        Previous value: -1000New value: +250
      • changedInput schema / properties / requestBody / properties / voice_preset_id / description
        Previous value: -"Voice preset identifier."New value: +"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."
      • changedInput schema / properties / requestBody / properties / voice_preset_id / enum
        Previous value: -[
        -  "Serious woman",
        -  "Wise woman",
        -  "Calm woman",
        -  "Fast-paced woman",
        -  "Calm young girl",
        -  "Expressive teen girl",
        -  "Calm teen girl",
        -  "Sweet girl",
        -  "Patient man",
        -  "Determined man",
        -  "Young elegant man",
        -  "Teen boy",
        -  "Friendly man",
        -  "Deep voice man"
        -]New value: +[
        +  "Serious woman",
        +  "Wise woman",
        +  "Calm woman",
        +  "Fast-paced woman",
        +  "Calm young girl",
        +  "Expressive teen girl",
        +  "Calm teen girl",
        +  "Sweet girl",
        +  "Patient man",
        +  "Determined man",
        +  "Young elegant man",
        +  "Teen 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"
        +]
    • ChangedcreateVoice6 fields changed
      • changedInput schema / properties / requestBody / description
        Previous value: -"Payload for generating a voice sample from a character description"New value: +"Payload for generating a voice sample from a character description and/or a character image"
      • addedInput schema / properties / requestBody / properties / image
        Added value: +{
        +  "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"
        +}
      • changedInput schema / properties / requestBody / properties / text / description
        Previous value: -"Text for the voice to speak (max 200 characters)."New value: +"Text for the voice to speak (max 100 characters)."
      • changedInput schema / properties / requestBody / properties / text / maxLength
        Previous value: -200New value: +100
      • changedInput schema / properties / requestBody / properties / voice_description / description
        Previous value: -"Text description of the voice character (e.g., \"deep-voiced warrior\", \"cheerful young girl\")."New value: +"Text description of the voice character (e.g., \"deep-voiced warrior\", \"cheerful young girl\"). Required unless image is given; with an image, a few words of hints."
      • changedInput schema / properties / requestBody / required
        Previous value: -[
        -  "voice_description",
        -  "text"
        -]New value: +[
        +  "text"
        +]
  3. 4 tool updates
    • ChangedanimateSprite4 fields changed
      • changedInput schema / properties / requestBody / properties / duration / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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\"."New value: +"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\"."
      • changedInput schema / properties / requestBody / properties / model / enum
        Previous value: -[
        -  "hydra",
        -  "forge",
        -  "forge-pixel",
        -  "blitz",
        -  "standard",
        -  "eagle",
        -  "eagle-audio"
        -]New value: +[
        +  "hydra",
        +  "hydra-plus",
        +  "forge",
        +  "forge-pixel",
        +  "blitz",
        +  "standard",
        +  "eagle",
        +  "eagle-audio"
        +]
      • changedInput schema / properties / requestBody / properties / motion_prompt / description
        Previous value: -"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."New value: +"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."
    • ChangedanimateSpriteKeyframes5 fields changed
      • changedInput schema / properties / requestBody / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / duration / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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\"."New value: +"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\"."
      • changedInput schema / properties / requestBody / properties / model / enum
        Previous value: -[
        -  "hydra",
        -  "forge",
        -  "forge-pixel"
        -]New value: +[
        +  "hydra",
        +  "hydra-plus",
        +  "forge",
        +  "forge-pixel"
        +]
      • changedInput schema / properties / requestBody / properties / motion_prompt / description
        Previous value: -"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."New value: +"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."
    • ChangededitSpritesheet4 fields changed
      • changedInput schema / properties / requestBody / description
        Previous value: -"Payload for editing a previously generated spritesheet. edit_mode selects the operation - prompt-driven edit (default), outpaint, or loop fixing."New value: +"Payload for editing a previously generated spritesheet. edit_mode selects the operation - prompt-driven edit (default), outpaint, loop fixing, or improve (finer detail, on hydra spritesheets only)."
      • changedInput schema / properties / requestBody / properties / edit_mode / description
        Previous value: -"Edit operation to perform. Default: \"prompt\"."New value: +"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\"."
      • changedInput schema / properties / requestBody / properties / edit_mode / enum
        Previous value: -[
        -  "prompt",
        -  "outpaint",
        -  "fix_loop"
        -]New value: +[
        +  "prompt",
        +  "outpaint",
        +  "fix_loop",
        +  "improve"
        +]
      • changedInput schema / properties / requestBody / properties / prompt / description
        Previous value: -"Edit instruction. Required for edit_mode \"prompt\", optional for \"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."New value: +"Edit instruction. Required for edit_mode \"prompt\", optional for \"outpaint\", not accepted for \"fix_loop\" or \"improve\". Focus it on a single change and keep it short (under about 50 words); run a second edit for more."
    • ChangedrotateSpritesheet3 fields changed
      • changedInput schema / properties / requestBody / properties / duration / description
        Previous value: -"Duration in seconds. Available values depend on the model:\n- hydra: 3, 3.5, 4, 4.5, 5"New value: +"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"
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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 Default: \"hydra\"."New value: +"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 Default: \"hydra\"."
      • changedInput schema / properties / requestBody / properties / model / enum
        Previous value: -[
        -  "hydra"
        -]New value: +[
        +  "hydra",
        +  "hydra-plus"
        +]
  4. 1 tool update
    • Changedcreate3DModel2 fields changed
      • changedInput schema / properties / requestBody / properties / back_image / description
        Previous value: -"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."New value: +"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. Prop model only: hero rejects it with HTTP 400. No extra cost."
      • addedInput schema / properties / requestBody / properties / model
        Added value: +{
        +  "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"
        +}
  5. 1 tool update
    • ChangedsubmitApiFeedback2 fields changed
      • changedInput schema / properties / requestBody / properties / job_id / description
        Previous value: -"The job the feedback is about, when there is one."New value: +"The id of the job the feedback is about. Same as a one-item job_ids."
      • addedInput schema / properties / requestBody / properties / job_ids
        Added value: +{
        +  "description": "The ids of the jobs the feedback is 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"
        +}
  6. 2 tool updates
    • Changedanimate3DModelPreset1 field changed
      • changedInput schema / properties / requestBody / properties / preset_id / description
        Previous value: -"id of an animation preset from the presets list. Only presets that expose a clip_url can be applied to a 3D model."New value: +"id of an animation preset from listAnimationPresets. Any preset id from that list works."
    • ChangedcreateSpeechPreset1 field changed
      • changedInput schema / properties / requestBody / properties / language / enum
        Previous value: -[
        -  "auto",
        -  "English",
        -  "Afrikaans",
        -  "Arabic",
        -  "Bulgarian",
        -  "Catalan",
        -  "Chinese",
        -  "Chinese,Yue",
        -  "Croatian",
        -  "Czech",
        -  "Danish",
        -  "English",
        -  "Filipino",
        -  "Finnish",
        -  "French",
        -  "German",
        -  "Greek",
        -  "Hebrew",
        -  "Hindi",
        -  "Hungarian",
        -  "Indonesian",
        -  "Italian",
        -  "Japanese",
        -  "Korean",
        -  "Malay",
        -  "Norwegian",
        -  "Nynorsk",
        -  "Persian",
        -  "Polish",
        -  "Portuguese",
        -  "Romanian",
        -  "Russian",
        -  "Slovak",
        -  "Slovenian",
        -  "Spanish",
        -  "Swedish",
        -  "Tamil",
        -  "Thai",
        -  "Turkish",
        -  "Ukrainian",
        -  "Vietnamese"
        -]New value: +[
        +  "auto",
        +  "English",
        +  "Afrikaans",
        +  "Arabic",
        +  "Bulgarian",
        +  "Catalan",
        +  "Chinese",
        +  "Chinese,Yue",
        +  "Croatian",
        +  "Czech",
        +  "Danish",
        +  "Filipino",
        +  "Finnish",
        +  "French",
        +  "German",
        +  "Greek",
        +  "Hebrew",
        +  "Hindi",
        +  "Hungarian",
        +  "Indonesian",
        +  "Italian",
        +  "Japanese",
        +  "Korean",
        +  "Malay",
        +  "Norwegian",
        +  "Nynorsk",
        +  "Persian",
        +  "Polish",
        +  "Portuguese",
        +  "Romanian",
        +  "Russian",
        +  "Slovak",
        +  "Slovenian",
        +  "Spanish",
        +  "Swedish",
        +  "Tamil",
        +  "Thai",
        +  "Turkish",
        +  "Ukrainian",
        +  "Vietnamese"
        +]
  7. 1 tool update
    • ChangedsubmitApiFeedback1 field changed
      • changedInput schema / properties / requestBody / properties / category / description
        Previous value: -"bug - the API errored, a job failed or got stuck, or a response did not match the documentation; limitation - the API does not support a parameter, operation or format you needed; feature_request - a new API capability you would like; praise - something that worked well; other - any other API issue. Generated content that looks wrong or does not match the prompt is a model limitation, not a bug: do not report it."New value: +"bug - the API errored, a job failed or got stuck, or a response did not match the documentation; limitation - the API does not support a parameter, operation or format you needed; feature_request - a new API capability you would like; praise - something that worked well; other - any other API issue. Generated content that looks wrong or does not match the prompt is a model limitation, not a bug: do not report it. A limitation the docs already describe (check with searchDocs) is known: do not report it."
  8. 1 tool update
    • ChangedadjustSpritesheet1 field changed
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"Size of the sprite in pixels, not of the frame: it sets how big the character is drawn, and each frame also holds the space around it, so frames come out larger than this value. Omit to keep the source's setting. 0 is maximum resolution. -9 is True Size: frames keep the size and position of the source's input image, so anything the animation adds beyond its edges is cut off - pick a fixed size or 0 to get it back. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -9."New value: +"Size of the sprite in pixels, not of the frame: it sets how big the character is drawn, and each frame also holds the space around it, so frames come out larger than this value. Omit to 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 and position of the source's input image, so anything the animation adds beyond its edges is cut off - pick a fixed size or 0 to get it back. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -1, -9."
  9. 6 tool updates
    • ChangedanimateSprite1 field changed
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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\"."New value: +"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\"."
    • ChangedanimateSpriteKeyframes1 field changed
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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\"."New value: +"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\"."
    • ChangededitSpritesheet1 field changed
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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): 2 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): 2 credits/s, min charge 4 credits · Best for low-res pixel art animations Default: \"hydra\"."New value: +"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s · Most capable all-around model, generates audio\n- \"forge\" (Forge): 2 credits/s · Sharper detail, simpler motion. Best for simple body shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 2 credits/s · Best for low-res pixel art animations Default: \"hydra\"."
    • ChangededitVideo1 field changed
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"Model to use. Available models:\n- \"griffin-hd\" (Griffin HD): 2 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: \"griffin-hd\"."New value: +"Model to use. Available models:\n- \"griffin-hd\" (Griffin HD): 2 credits/s · 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: \"griffin-hd\"."
    • ChangedrotateSpritesheet1 field changed
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s, min charge 9 credits · Most capable all-around model, generates audio Default: \"hydra\"."New value: +"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 Default: \"hydra\"."
    • ChangedtransferMotion1 field changed
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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): 2 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): 2 credits/s, min charge 4 credits · Best for low-res pixel art animations\n- \"tango\" (Tango): 4 credits/s, min charge 4 credits · 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.\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\"."New value: +"Model to use. Available models:\n- \"hydra\" (Hydra): 3 credits/s · Most capable all-around model, generates audio\n- \"forge\" (Forge): 2 credits/s · Sharper detail, simpler motion. Best for simple body shapes and short actions; may need a few tries\n- \"forge-pixel\" (Forge Pixel): 2 credits/s · Best for low-res pixel art animations\n- \"tango\" (Tango): 4 credits/s, min charge 4 credits · 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.\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\"."
  10. 3 tool updates
    • ChangedanimateSprite3 fields changed
      • removedInput schema / properties / requestBody / properties / margin_ratio
        Removed value: -{
        -  "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"
        -}
      • changedInput schema / properties / requestBody / properties / margin_ratio_horizontal / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / margin_ratio_vertical / description
        Previous value: -"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."New value: +"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."
    • ChangedanimateSpriteKeyframes3 fields changed
      • removedInput schema / properties / requestBody / properties / margin_ratio
        Removed value: -{
        -  "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"
        -}
      • changedInput schema / properties / requestBody / properties / margin_ratio_horizontal / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / margin_ratio_vertical / description
        Previous value: -"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."New value: +"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."
    • ChangedtransferMotion3 fields changed
      • removedInput schema / properties / requestBody / properties / margin_ratio
        Removed value: -{
        -  "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. Defaults to 0.15 when no margin value is given at all.",
        -  "format": "float",
        -  "type": "number"
        -}
      • changedInput schema / properties / requestBody / properties / margin_ratio_horizontal / description
        Previous value: -"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. Overrides the legacy margin_ratio on this axis."New value: +"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."
      • changedInput schema / properties / requestBody / properties / margin_ratio_vertical / description
        Previous value: -"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. Overrides the legacy margin_ratio on this axis."New value: +"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."
  11. 6 tool updates
    • ChangedadjustSpritesheet1 field changed
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"Size of each frame in pixels (width and height). Omit to keep the source's frame size. 0 is maximum resolution. -9 is True Size: frames keep the size and position of the source's input image, so anything the animation adds beyond its edges is cut off - pick a fixed size or 0 to get it back. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -9."New value: +"Size of the sprite in pixels, not of the frame: it sets how big the character is drawn, and each frame also holds the space around it, so frames come out larger than this value. Omit to keep the source's setting. 0 is maximum resolution. -9 is True Size: frames keep the size and position of the source's input image, so anything the animation adds beyond its edges is cut off - pick a fixed size or 0 to get it back. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0, -9."
    • ChangedanimateSprite1 field changed
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"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. 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."New value: +"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."
    • ChangedanimateSpriteKeyframes1 field changed
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"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. 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."New value: +"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."
    • ChangededitSpritesheet1 field changed
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"Size of each frame in pixels (width and height). 0 is for maximum resolution. Omit to keep the source spritesheet's frame size. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0."New value: +"Size of the sprite in pixels, not of the frame - it sets how big the character is drawn, and 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's setting. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0."
    • ChangedrotateSpritesheet1 field changed
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"Size of each frame in pixels (width and height). 0 is for maximum resolution. Omit to keep the source spritesheet's frame size. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0."New value: +"Size of the sprite in pixels, not of the frame - it sets how big the character is drawn, and 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's setting. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0."
    • ChangedtransferMotion1 field changed
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"Size of each frame in pixels (width and height). 0 is maximum 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, 192, 256, 384, 0. Default: 0."New value: +"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. 0 is maximum 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, 192, 256, 384, 0. Default: 0."
  12. 3 tool updates
    • AddedadjustSpritesheet
    • ChangedanimateSprite1 field changed
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"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."New value: +"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. 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."
    • ChangedanimateSpriteKeyframes1 field changed
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"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."New value: +"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. 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."
  13. 1 tool update
    • AddedrotateSpritesheet
  14. 4 tool updates
    • ChangedanimateSprite1 field changed
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 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."New value: +"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."
    • ChangedanimateSpriteKeyframes1 field changed
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 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."New value: +"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."
    • ChangededitSpritesheet1 field changed
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Number of frames in the output spritesheet. Omit to keep the source spritesheet's frame count. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all. Accepted values: 4, 9, 16, 25, 36, 49, 64."New value: +"Number of frames in the output spritesheet. 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, 36, 49, 64."
    • ChangedtransferMotion1 field changed
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 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."New value: +"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."
  15. 4 tool updates
    • ChangedanimateSprite2 fields changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"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. If you do turn it off, set the margins yourself and keep them tight: send margin_ratio_horizontal / margin_ratio_vertical (about 0.15 each), which selects margin_ratio_mode \"manual\". Automatic framing needs the augmented prompt, so augment_prompt false with the default \"auto\" margin mode fails with HTTP 400. Do not switch to margin_ratio_mode \"none\" just to get past that error - see margin_ratio_mode. Default: true."New value: +"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."
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 49 and 64 are more prone to looping issues and motion blur. 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."New value: +"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 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."
    • ChangedanimateSpriteKeyframes2 fields changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"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. If you do turn it off, set the margins yourself and keep them tight: send margin_ratio_horizontal / margin_ratio_vertical (about 0.15 each), which selects margin_ratio_mode \"manual\". Automatic framing needs the augmented prompt, so augment_prompt false with the default \"auto\" margin mode fails with HTTP 400. Do not switch to margin_ratio_mode \"none\" just to get past that error - see margin_ratio_mode. Default: true."New value: +"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."
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 49 and 64 are more prone to looping issues and motion blur. 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."New value: +"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 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."
    • ChangededitSpritesheet1 field changed
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Number of frames in the output spritesheet. Omit to keep the source spritesheet's frame count. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all. 49 and 64 are more prone to looping issues and motion blur. Accepted values: 4, 9, 16, 25, 36, 49, 64."New value: +"Number of frames in the output spritesheet. Omit to keep the source spritesheet's frame count. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all. Accepted values: 4, 9, 16, 25, 36, 49, 64."
    • ChangedtransferMotion1 field changed
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 49 and 64 are more prone to looping issues and motion blur. 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."New value: +"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 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."
  16. 16 tool updates
    • Changedanimate3DModel1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Rewrite the prompt into a detailed motion caption with an LLM (recommended). Default: true."New value: +"Rewrites the prompt into a detailed motion caption with an LLM. 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."
    • ChangedanimateSprite9 fields changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"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."New value: +"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. If you do turn it off, set the margins yourself and keep them tight: send margin_ratio_horizontal / margin_ratio_vertical (about 0.15 each), which selects margin_ratio_mode \"manual\". Automatic framing needs the augmented prompt, so augment_prompt false with the default \"auto\" margin mode fails with HTTP 400. Do not switch to margin_ratio_mode \"none\" just to get past that error - see margin_ratio_mode. Default: true."
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Number of frames in the output spritesheet. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36."New value: +"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 49 and 64 are more prone to looping issues and motion blur. 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."
      • changedInput schema / properties / requestBody / properties / image_type / description
        Previous value: -"Type of sprite being animated. Affects generation parameters and styling. Default: \"sprite\"."New value: +"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\"."
      • changedInput schema / properties / requestBody / properties / margin_ratio_horizontal / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / margin_ratio_mode / description
        Previous value: -"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\"."New value: +"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\"."
      • changedInput schema / properties / requestBody / properties / margin_ratio_vertical / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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\"."New value: +"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\"."
      • changedInput schema / properties / requestBody / properties / motion_prompt / description
        Previous value: -"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."New value: +"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."
    • ChangedanimateSpriteKeyframes10 fields changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"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."New value: +"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. If you do turn it off, set the margins yourself and keep them tight: send margin_ratio_horizontal / margin_ratio_vertical (about 0.15 each), which selects margin_ratio_mode \"manual\". Automatic framing needs the augmented prompt, so augment_prompt false with the default \"auto\" margin mode fails with HTTP 400. Do not switch to margin_ratio_mode \"none\" just to get past that error - see margin_ratio_mode. Default: true."
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Number of frames in the output spritesheet. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36."New value: +"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 49 and 64 are more prone to looping issues and motion blur. 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."
      • changedInput schema / properties / requestBody / properties / image_type / description
        Previous value: -"Type of sprite being animated. Affects generation parameters and styling. Default: \"sprite\"."New value: +"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\"."
      • changedInput schema / properties / requestBody / properties / margin_ratio_horizontal / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / margin_ratio_mode / description
        Previous value: -"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\"."New value: +"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\"."
      • changedInput schema / properties / requestBody / properties / margin_ratio_vertical / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / requestBody / properties / middle_image / description
        Previous value: -"The url OR base64 of the middle keyframe the animation passes through between the initial and final frames."New value: +"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."
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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\"."New value: +"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\"."
      • changedInput schema / properties / requestBody / properties / motion_prompt / description
        Previous value: -"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."New value: +"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."
    • ChangedcreateAmbiance1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangedcreateAudioTransform1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangedcreateImage1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangedcreateMusic1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangedcreateSoundEffect1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangedcreateVideo1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangedcreateVoice1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangededitImage1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangededitSpritesheet4 fields changed
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Number of frames in the output spritesheet. Omit to keep the source spritesheet's frame count. Accepted values: 4, 9, 16, 25, 36, 49, 64."New value: +"Number of frames in the output spritesheet. Omit to keep the source spritesheet's frame count. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all. 49 and 64 are more prone to looping issues and motion blur. Accepted values: 4, 9, 16, 25, 36, 49, 64."
      • changedInput schema / properties / requestBody / properties / images / description
        Previous value: -"Optional reference images (up to 5), each a URL or base64, to guide the edit."New value: +"Optional reference images (up to 5), each 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."
      • changedInput schema / properties / requestBody / properties / prompt / description
        Previous value: -"Edit instruction. Required for edit_mode \"prompt\", optional for \"outpaint\", not accepted for \"fix_loop\"."New value: +"Edit instruction. Required for edit_mode \"prompt\", optional for \"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."
      • changedInput schema / properties / requestBody / properties / spritesheet_url / description
        Previous value: -"URL of a spritesheet you generated in the last 7 days (returned by animateSprite, transferMotion, or a previous edit as spritesheet_url). External URLs are not accepted."New value: +"URL of a spritesheet you generated in the last 7 days (returned by animateSprite, transferMotion, or a previous edit 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."
    • ChangedgeneratePose1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangedgenerateWithStyle1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangedrotateSprite1 field changed
      • changedInput schema / properties / requestBody / properties / augment_prompt / description
        Previous value: -"Augment the prompt behind the scenes. Disable to have more control. Default: true."New value: +"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."
    • ChangedtransferMotion7 fields changed
      • changedInput schema / properties / requestBody / properties / frame_size / description
        Previous value: -"Size of each frame in pixels (width and height). 0 is for maximum resolution. Accepted values: 32, 64, 96, 128, 192, 256, 384, 0. Default: 0."New value: +"Size of each frame in pixels (width and height). 0 is maximum 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, 192, 256, 384, 0. Default: 0."
      • changedInput schema / properties / requestBody / properties / frames / description
        Previous value: -"Number of frames in the output spritesheet. Accepted values: 4, 9, 16, 25, 36, 49, 64. Default: 36."New value: +"Maximum number of frames in the output spritesheet. Allow about one second of duration per 12 frames - above that the model may not be able to produce them all (36 frames needs a duration of at least 3). 49 and 64 are more prone to looping issues and motion blur. 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."
      • changedInput schema / properties / requestBody / properties / margin_ratio_horizontal / description
        Previous value: -"Horizontal padding around the sprite as a ratio (0.0 to 1.0). Useful for animations that extend sideways (e.g., sword slashes, punches). Overrides the legacy margin_ratio on this axis."New value: +"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. Overrides the legacy margin_ratio on this axis."
      • changedInput schema / properties / requestBody / properties / margin_ratio_mode / description
        Previous value: -"Controls how margins are applied around the sprite. Defaults to \"manual\". Sending \"none\" explicitly together with a margin value fails with HTTP 400 (the value would be ignored). Default: \"manual\"."New value: +"How the sprite is framed for generation. Defaults to \"manual\" (0.15 on each axis when no margin value is given); transfer motion has no \"auto\". 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. Keep the margins tight - about 0.15 - and raise only the axis the motion needs. \"none\" animates 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 400 (the value would be ignored). Default: \"manual\"."
      • changedInput schema / properties / requestBody / properties / margin_ratio_vertical / description
        Previous value: -"Vertical padding around the sprite as a ratio (0.0 to 1.0). Useful for animations that extend up or down (e.g., jumps). Overrides the legacy margin_ratio on this axis."New value: +"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. Overrides the legacy margin_ratio on this axis."
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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): 2 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): 2 credits/s, min charge 4 credits · Best for low-res pixel art animations\n- \"tango\" (Tango): 4 credits/s, min charge 4 credits · 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: \"hydra\"."New value: +"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): 2 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): 2 credits/s, min charge 4 credits · Best for low-res pixel art animations\n- \"tango\" (Tango): 4 credits/s, min charge 4 credits · 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.\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\"."
      • changedInput schema / properties / requestBody / properties / video / description
        Previous value: -"URL of the video to use as motion source - the `video_url` of a spritesheet from animateSprite, or your own clip. Videos up to 4 seconds work best. Either `video` or `preset_id` + `perspective` + `direction` must be provided; when both are sent the video is used."New value: +"URL of the video to use as motion source - the `video_url` of a spritesheet from animateSprite, or your own clip. Videos up to 4 seconds work best. Either `video` or `preset_id` + `perspective` + `direction` must be provided; when both are sent the video is used. 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`."
  17. 1 tool update
    • ChangededitImage1 field changed
      • changedInput schema / properties / requestBody / properties / image_type / description
        Previous value: -"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."New value: +"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 the image is an upload or a link from elsewhere, so a sprite is edited as a sprite and keeps its transparent background."
  18. 5 tool updates
    • ChangedanimateSprite1 field changed
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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, 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\"."New value: +"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\"."
    • ChangedanimateSpriteKeyframes1 field changed
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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, 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\"."New value: +"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\"."
    • ChangededitImage1 field changed
      • addedInput schema / properties / requestBody / properties / image_type
        Added value: +{
        +  "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"
        +}
    • ChangededitSpritesheet1 field changed
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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): 2 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): 2 credits/s, min charge 4 credits · Best for low-res pixel art animations Default: \"hydra\"."New value: +"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): 2 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): 2 credits/s, min charge 4 credits · Best for low-res pixel art animations Default: \"hydra\"."
    • ChangedtransferMotion1 field changed
      • changedInput schema / properties / requestBody / properties / model / description
        Previous value: -"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): 2 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): 2 credits/s, min charge 4 credits · Best for low-res pixel art animations\n- \"tango\" (Tango): 4 credits/s, min charge 4 credits · 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: \"hydra\"."New value: +"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): 2 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): 2 credits/s, min charge 4 credits · Best for low-res pixel art animations\n- \"tango\" (Tango): 4 credits/s, min charge 4 credits · 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: \"hydra\"."

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.