---
title: "Preview a 3D model as a sprite in a style: one view, a few frames, as an inline mp4. Free; nothing is stored (Roles: user). Dev deployment only."
method: POST
path: "/games/sprite3d/preview"
tags: ["Games"]
---

# Preview a 3D model as a sprite in a style: one view, a few frames, as an inline mp4. Free; nothing is stored (Roles: user). Dev deployment only.

`POST /games/sprite3d/preview`

## Request body

- Sprite3DPreviewPayload
  - `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.
      - `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 and is dev only for now. Ignored by the other 3D operations.
        - `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
    - `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
  - `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, humanoid 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
  - `direction` 'S' | 'SW' | 'W' | 'NW' | 'N' | 'NE' | 'E' | 'SE', required — Where the camera stands around a character facing S.
  - `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; default 384.

## Response `200`

Success

- Sprite3DPreviewResult
  - `request_id` string
  - `video` string — The preview as an mp4 data uri (not stored).
  - `width` integer
  - `height` integer
  - `num_frames` integer
  - `fps` number, float
  - `preview_scale` number, float
  - `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 and file urls only).

## Other responses

- `204` — Cancelled (DELETE /games/generate/{request_id}) by a newer preview
- `400` — Error

## Changes

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

[Change history](https://skmtc.dev/ludo/apis/ludo-ai-api/changes/games/sprite3d/preview/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/4c7d0deae87e?raw)
