---
title: "Shares a playable (Roles: user)"
method: POST
path: "/project/playables/{id}/share"
tags: ["Projects"]
---

# Shares a playable (Roles: user)

`POST /project/playables/{id}/share`

## Path parameters

- `id` string, required

## Query parameters

- `allowPublic` boolean

## Request body

- Playable
  - `_id` string
  - `user_id` string
  - `engine` 'phaser' | 'threejs' | 'pixijs'
  - `title` string
  - `summary` string
  - `original_prompt` string
  - `how_to_play` string
  - `code` string
  - `compiled_code` string
  - `chat_history` PlayableChatMessage[]
    - `sender` string
    - `text` string
    - `diff` string
    - `images` string[]
    - `history_index` integer
    - `followups` string[]
  - `last_modified` integer
  - `code_history` string
  - `assets` PlayableAsset[]
    - `id` string
    - `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
    - `three_d_asset` ThreeDAsset
      - `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[]
        - `generation_parameters` ThreeDGenerationParameters
          - `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
      - `animations` Animation3DClip[] — Accepted text-driven animation clips attached to this 3D model. Hydrated onto the history entry when listing 3D generations so the frontend can render the clip selector / management modal. Clips are stored in the Animation3DClip collection, not embedded.
        - `_id` string, required
        - `user_id` string, required
        - `model_asset_id` string, required — Parent 3D asset id (the GenerationHistory _id, which for three_d_asset equals image.id).
        - `clip_name` string
        - `prompt` string
        - `preset_id` string — Set when the clip came from the preset library (retargeting) rather than a text prompt.
        - `mode` 'rot_trans' | 'rot_only'
        - `seed` integer
        - `glb_url` string — Uploaded animation-only GLB (skeleton + one clip, no mesh). May be gzip-compressed like model GLBs.
        - `preview_url` string — Uploaded mp4 preview of the clip playing on the model.
        - `accepted` boolean — Whether this clip is baked into the model's downloadable full GLB. Every generated clip is persisted (so the frontend never loses them); `accepted` is the separate opt-in that controls download inclusion.
        - `motion` number, float
        - `fit_rmse` number, float
        - `date` integer
        - `deleted` boolean
    - `description` string
    - `alias` string
  - `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
  - `art_style` string
  - `perspective` string

## Response `200`

Success

- SharedPlayable
  - `_id` string
  - `user_id` string
  - `engine` 'phaser' | 'threejs' | 'pixijs'
  - `title` string
  - `summary` string
  - `how_to_play` string
  - `code` string
  - `compiled_code` string
  - `date` integer
  - `remixes` integer
  - `views` integer
  - `allow_public` boolean
  - `assets` PlayableAsset[]
    - `id` string
    - `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
    - `three_d_asset` ThreeDAsset
      - `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[]
        - `generation_parameters` ThreeDGenerationParameters
          - `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
      - `animations` Animation3DClip[] — Accepted text-driven animation clips attached to this 3D model. Hydrated onto the history entry when listing 3D generations so the frontend can render the clip selector / management modal. Clips are stored in the Animation3DClip collection, not embedded.
        - `_id` string, required
        - `user_id` string, required
        - `model_asset_id` string, required — Parent 3D asset id (the GenerationHistory _id, which for three_d_asset equals image.id).
        - `clip_name` string
        - `prompt` string
        - `preset_id` string — Set when the clip came from the preset library (retargeting) rather than a text prompt.
        - `mode` 'rot_trans' | 'rot_only'
        - `seed` integer
        - `glb_url` string — Uploaded animation-only GLB (skeleton + one clip, no mesh). May be gzip-compressed like model GLBs.
        - `preview_url` string — Uploaded mp4 preview of the clip playing on the model.
        - `accepted` boolean — Whether this clip is baked into the model's downloadable full GLB. Every generated clip is persisted (so the frontend never loses them); `accepted` is the separate opt-in that controls download inclusion.
        - `motion` number, float
        - `fit_rmse` number, float
        - `date` integer
        - `deleted` boolean
    - `description` string
    - `alias` string
  - `template` 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

## Other responses

- `400` — Error

---

[API](https://skmtc.net/ludo/apis/ludo-ai-api.md) · [All operations](https://skmtc.net/ludo/apis/ludo-ai-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/ludo/ludo-ai-api/revisions/3af866d68651/schema)
