---
title: "Enqueue a 3D-to-sprite render: each view asked for (directions) as its own styled spritesheet, rendered together so they line up. The job's result is the list of sheets. One RENDER_SPRITE_3D charge per sheet (Roles: user)."
method: POST
path: "/jobs/render-sprite-3d"
tags: ["Jobs"]
---

# Enqueue a 3D-to-sprite render: each view asked for (directions) as its own styled spritesheet, rendered together so they line up. The job's result is the list of sheets. One RENDER_SPRITE_3D charge per sheet (Roles: user).

`POST /jobs/render-sprite-3d`

## Request

- Base URL: `https://api.ludo.ai/api`
- URL: `https://api.ludo.ai/api/jobs/render-sprite-3d`
- Auth: API key in header `Authorization`

## Request body

- RenderSprite3DPayload
  - `request_id` string
  - `generated_model` ThreeDModelInput
    - `tags` string[]
    - `asset` AssetGeneration
      - `id` string
      - `rigged` boolean: True once the model carries a skeleton and skin weights (set by rig-model). Gates the animation flow and the re-rig guard.
      - `animatable` boolean: The ML's humanoid check on the model's rig, as reported with the model: true when it passed, false when it failed or there is no rig. Gates the animation presets (retargeting needs a humanoid). Absent when unknown: on models rigged before the ML saved the check, and whenever the ML reports null (Prometheus responses drop nulls). Never null: swagger-tools ignores x-nullable, so a null here fails request validation.
      - `seed` integer
      - `images_b64` string[]
      - `params_encrypted` string
      - `request_id` string
      - `video_b64` string
      - `mesh_video_b64` string
      - `snapshots_b64` string[]
      - `model_b64` string
      - `binary_data_b64` string
      - `voxels_b64` string
      - `mask_snapshots_b64` string[]
      - `depth_snapshots_b64` string[]
      - `normal_snapshots_b64` string[]
      - `textured` boolean: Whether the ML generated a texture for the model.
      - `view_azimuths` number[]: Camera azimuths, in degrees, of the input views the ML built the model from: [0] for a front view alone, [0, 180] with a back view.
      - `generation_parameters` ThreeDGenerationParameters
        - `model` 'prop' | 'hero': Image-to-3D model (THREE_D_MODELS in credits.js): prop (default) or hero, which bills GENERATE_3D_MODEL_HERO. Ignored by the other 3D operations.
        - `rig` boolean: Image-to-3D only: also rig the model (skeleton + skin weights) in the same call, as rig-model would. Bills RIG_3D_MODEL on top of the model when the model comes back rigged. Ignored by the other 3D operations.
        - `rig_type` 'general' | 'humanoid' | 'game' | 'humanoid_template' | 'humanoid_template_hands': The rig a model rigged in this call got. Always general: any other value sent is overridden (MediaGeneration.imageTo3D). Kept in the enum so an older client sending one is not refused, and so models rigged before the change keep their recorded type.
        - `joint_naming` 'smpl' | 'mixamo' | 'humanik' | 'unreal' | 'godot' | 'rigify' | 'vroid': With rig, the bone naming convention (as RigModelPayload.joint_naming).
        - `target_num_faces` integer
        - `dynamic_simplification` number, float
        - `remeshing` string
        - `texture_size` integer
        - `texture_type` string
        - `render_format` string
        - `render_video` boolean
    - `image` GameImage
      - `tags` string[]
      - `id` string
      - `image_id` string
      - `url` string
      - `type` string
      - `final_score` number, float
      - `nsfw_prob` number, float
      - `similarity` number, float
      - `width` integer
      - `height` integer
      - `game_id` string
      - `hosted_filename` string
      - `icon` boolean
      - `targetSize` integer
      - `seed` integer
      - `embedded` boolean
      - `analysed` boolean
      - `image` string
      - `image_type` string
      - `prompt` string
      - `motion_prompt` string
      - `request_id` string
      - `hints` string[]
      - `selected_genres` string[]
      - `selected_colors` string[]
      - `selected_style` string
      - `selected_perspective` string
      - `is_safe` boolean
      - `platform` string
      - `loading` boolean
      - `original_hints` string[]
      - `genres` string[]
      - `edit_mask` string
      - `edit_mode` string
      - `camera_rotation` integer
      - `camera_elevation` integer
      - `edit_mask_pil_image` PILImage
        - `format` string
        - `format_description` string
      - `pil_image` PILImage
        - `format` string
        - `format_description` string
      - `nsfw` number, float
      - `pose` SpritePose
        - `animation_prompt` string: Animation description for the sprite pose
        - `margin_ratio` number, float: Margin ratio for the sprite animation
        - `margin_ratio_mode` string
        - `name` string: Name of the sprite pose
        - `prompt` string: Prompt description for the sprite pose
      - `render_3d` Sprite3DRender
        - `style_id` string
        - `style_version` integer
        - `style_params` object: Every setting of the style as rendered, by name.
        - `params` object: The renderer's own parameters (e.g. renderer, version).
        - `perspective` string
        - `direction` string
        - `animation_name` string
        - `fps` number, float
        - `keep_horizontal_travel` boolean
        - `keep_vertical_travel` boolean
        - `pixel_block` integer
        - `generated_model` object: The model that was rendered (its id, file urls and, from render, history_id - the three_d_asset history entry it came from).
      - `pixel_grid` integer[], nullable: Pixel-art grid dimensions [width, height] the ML detected in (or gave) the image, as on GeneratedVideo. The ML reports it on every image generation; absent when no grid was found and on images saved before it was recorded.
      - `pixel_size` number, float: Pixel art conversion only: the size of one pixel-art pixel, in the source image's pixels (the caller's, or the detected one).
      - `model` string: Id of the model the ML reports for the image (klimt, frida, ...). Absent on images saved before it was kept.
    - `back_image` GameImage
      - `tags` string[]
      - `id` string
      - `image_id` string
      - `url` string
      - `type` string
      - `final_score` number, float
      - `nsfw_prob` number, float
      - `similarity` number, float
      - `width` integer
      - `height` integer
      - `game_id` string
      - `hosted_filename` string
      - `icon` boolean
      - `targetSize` integer
      - `seed` integer
      - `embedded` boolean
      - `analysed` boolean
      - `image` string
      - `image_type` string
      - `prompt` string
      - `motion_prompt` string
      - `request_id` string
      - `hints` string[]
      - `selected_genres` string[]
      - `selected_colors` string[]
      - `selected_style` string
      - `selected_perspective` string
      - `is_safe` boolean
      - `platform` string
      - `loading` boolean
      - `original_hints` string[]
      - `genres` string[]
      - `edit_mask` string
      - `edit_mode` string
      - `camera_rotation` integer
      - `camera_elevation` integer
      - `edit_mask_pil_image` PILImage
        - `format` string
        - `format_description` string
      - `pil_image` PILImage
        - `format` string
        - `format_description` string
      - `nsfw` number, float
      - `pose` SpritePose
        - `animation_prompt` string: Animation description for the sprite pose
        - `margin_ratio` number, float: Margin ratio for the sprite animation
        - `margin_ratio_mode` string
        - `name` string: Name of the sprite pose
        - `prompt` string: Prompt description for the sprite pose
      - `render_3d` Sprite3DRender
        - `style_id` string
        - `style_version` integer
        - `style_params` object: Every setting of the style as rendered, by name.
        - `params` object: The renderer's own parameters (e.g. renderer, version).
        - `perspective` string
        - `direction` string
        - `animation_name` string
        - `fps` number, float
        - `keep_horizontal_travel` boolean
        - `keep_vertical_travel` boolean
        - `pixel_block` integer
        - `generated_model` object: The model that was rendered (its id, file urls and, from render, history_id - the three_d_asset history entry it came from).
      - `pixel_grid` integer[], nullable: Pixel-art grid dimensions [width, height] the ML detected in (or gave) the image, as on GeneratedVideo. The ML reports it on every image generation; absent when no grid was found and on images saved before it was recorded.
      - `pixel_size` number, float: Pixel art conversion only: the size of one pixel-art pixel, in the source image's pixels (the caller's, or the detected one).
      - `model` string: Id of the model the ML reports for the image (klimt, frida, ...). Absent on images saved before it was kept.
  - `user_model` string: URL of an uploaded GLB (rigged, to animate it). Provide this OR generated_model.
  - `user_model_file_type` 'glb'
  - `animation_clip_id` string: One of the model's saved animations (an Animation3DClip id) to render.
  - `preset_id` string: An animation preset (/utils/animation-presets) the ML retargets onto the rigged model and renders.
  - `crop_loop` boolean: With preset_id, trim the preset to the span that loops seamlessly. Omit to follow the preset's own loop flag.
  - `model_animation` string: Name of an animation the model file itself carries. With no animation at all the model renders as a still.
  - `perspective` 'horizon' | 'low' | 'isometric' | 'high' | 'top', required
  - `directions` string[]: Where the camera stands around a character facing S, each view at most once. One result per view, in this order, rendered together on the same frame, scale and floor, so the views line up.
  - `direction` 'S' | 'SW' | 'W' | 'NW' | 'N' | 'NE' | 'E' | 'SE': Deprecated: one view. Use directions.
  - `style_id` string, required: id of a style from /utils/sprite3d-styles
  - `style_version` integer: Version of the style; omit for its current one.
  - `style_params` object: Overrides of the style's settings, by name, each one of its listed choices (or true/false, or a colour for a colour setting).
  - `keep_horizontal_travel` boolean: Keep the animation's ground travel (the character moves across the frame). Off by default.
  - `keep_vertical_travel` boolean: Keep the animation's vertical root motion (jumps, bobbing). On by default.
  - `target_frame_size` integer: Sprite size in px (the frame's longer side); default 256.
  - `num_frames` integer: Frames per sheet, sampled over the clip (fewer when the clip has fewer keyframes; a still gives one). Default 16.
  - `loop` boolean: Sample the clip as a seamless loop. Omit to follow the animation's own loop flag.

## Response `202`

Accepted

- JobAcceptedResponse
  - `jobId` string, required
  - `status` 'queued' | 'running' | 'succeeded' | 'failed' | 'canceled', required
  - `queue_position` integer

## Other responses

- `400`: Error
- `402`: Insufficient credits

## Changes

- **2026-10-07** `4c7d0deae87e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/ludo/apis/ludo-ai-api/changes/jobs/render-sprite-3d/post.md)

---

[API](https://skmtc.dev/ludo/apis/ludo-ai-api.md) - [All operations](https://skmtc.dev/ludo/apis/ludo-ai-api/llms.txt) - [OpenAPI document](https://skmtc.dev/ludo/apis/ludo-ai-api/revisions/4efeb12a23c9?raw)
