---
title: "Gets the user the inital data necessary to use the platform (Roles: user)"
method: GET
path: "/initial-payload"
tags: ["Misc"]
---

# Gets the user the inital data necessary to use the platform (Roles: user)

`GET /initial-payload`

## Response `200`

Success

- UserRefreshPayload
  - `login_payload` LoginPayload
    - `token` string
    - `user` User
      - `_id` string, required
      - `name` string
      - `first_name` string
      - `last_name` string
      - `teams` string[]
      - `email` string, required
      - `stripped_email` string
      - `password` string
      - `role` 'user', required
      - `stripe_id` string
      - `selected_project` string
      - `number_generations` integer
      - `registration_date` integer
      - `whats_new_date` integer
      - `trial_end` integer
      - `tax` Tax
        - `value` string
        - `type` string
      - `address` Address
        - `line1` string
        - `line2` string
        - `city` string
        - `postal_code` string
        - `state` string
        - `country` string
      - `tutorials_closed` string[]
      - `missions_completed` string[]
      - `credits` GenerationCreditsInfo
        - `current` number, float
        - `max` number, float
        - `reset_date` integer
        - `extra` number, float
        - `total` number, float
        - `paused` boolean
        - `has_tier_logic` boolean
        - `uses_team_credits` boolean
        - `credits_upfront` boolean
        - `grace_until` integer — If set, the user's subscription ended and their remaining credits stay spendable until this unix timestamp (30-day grace period)
        - `grace_reason` string — Stripe cancellation_details.reason at termination (e.g. cancellation_requested, payment_failed)
      - `auto_topup` AutoTopupSettings
        - `enabled` boolean
        - `threshold` number, float — When available credits (max + extra - current) drop below this, an automatic top-up is attempted
        - `credits` integer — Fixed credit amount to buy on each automatic top-up (TOPUP bracket pricing)
        - `armed` boolean — Hysteresis latch: true while the balance is above the threshold; consumed (set false) by the single attempt per below-threshold episode
      - `country` string
      - `genres` string[]
      - `platform` string
      - `welcome_form` boolean
      - `paywall` boolean
      - `video_generator` boolean
      - `subscription_stats` SubscriptionStats
        - `revenue_year` number, float
        - `revenue_12months` number, float
        - `revenue_total` number, float
        - `plan_name` string
        - `plan_interval` string
        - `is_customer` boolean
        - `became_customer_date` integer
      - `date_whats_new` integer
      - `api_key` string
      - `cookie_consent` boolean
      - `double_optin_sent` boolean
      - `credits_exhausted_at` integer
      - `credits_exhausted_synced_at` integer
      - `risk_hold` boolean
      - `marketing_consent` MarketingConsent
        - `granted` boolean
        - `date` integer
        - `source` string
      - `fbp` string
      - `fbc` string
      - `fbclid` string
      - `rdt_cid` string
      - `last_login_ip` string — IP address of last login
      - `purchase_ips` PurchaseIp[] — Capped history of client IPs captured at purchase actions (subscribe, checkout, card/payment confirmation, renewal). Used as chargeback evidence to tie a disputed transaction to the rightful cardholder.
        - `ip` string
        - `date` integer — Unix epoch seconds when this IP was captured at a purchase action
      - `preferred_content_type` string
      - `questionnaire` Questionnaire
        - `date` integer
        - `questions` Question[]
          - `question` string
          - `answer` string
      - `rate_limits_override` integer
      - `queue_concurrency_override` integer — Per-user override for the queue-runner's max concurrent running jobs. If unset, falls back to subscription.plan.metadata.queue_concurrency, then 1.
      - `referral_code` string
      - `referred_by` string — User ID of the referrer
      - `referral_credited` boolean — Whether referral bonus credits have been issued for this user
      - `subscriber_welcome_sent_at` integer
      - `discord_link_id` string — Opaque uuid shown on the user's Discord profile as their Ludo connection. Rotatable. Never the user id.
      - `discord_user_id` string — Discord snowflake of the linked account.
      - `discord_linked_at` string, date-time — When the Discord account was last linked.
    - `subscription` Subscription
      - `id` string
      - `object` string
      - `collection_method` string
      - `cancel_at_period_end` boolean
      - `canceled_at` integer
      - `cancel_at` integer
      - `created` integer
      - `current_period_end` integer
      - `current_period_start` integer
      - `customer` string
      - `days_until_due` integer
      - `ended_at` integer
      - `plan` PaymentPlan
        - `id` string, required
        - `object` string
        - `description` string
        - `amount` integer
        - `statement_descriptor` string
        - `trial_period_days` integer
        - `created` integer
        - `currency` string
        - `interval` string
        - `interval_count` integer
        - `livemode` boolean
        - `active` boolean
        - `billing_scheme` string
        - `product` string
        - `name` string
        - `usage_type` string
        - `nickname` string
        - `amount_off` integer
        - `percent_off` integer
        - `metadata` PaymentPlanMetadata
          - `projects` string
          - `description` string
          - `seats` string
          - `favorites` string
          - `team` string
          - `amount_text` string
          - `credits` string
          - `premium` string
          - `magic_link` string
          - `api` string
          - `rate_limits` string
          - `queue_concurrency` string
      - `quantity` integer
      - `start_date` integer
      - `status` string
      - `tax_percent` integer
      - `trial_end` integer
      - `trial_start` integer
      - `billing_cycle_anchor` integer
      - `latest_invoice` string
      - `from_team` boolean
      - `pause_collection` SubscriptionPauseCollection
        - `behavior` string
        - `resumes_at` integer
    - `registered` boolean
    - `magic_link_sent` boolean
    - `magic_link_message` string
  - `projects` Project[]
    - `_id` string
    - `user_id` string
    - `team_id` string
    - `name` string
    - `description` string
    - `date` integer
    - `date_updated` integer
    - `archived` boolean
    - `genres` string[]
    - `keywords` string[]
    - `platforms` string[]
    - `platform` string
    - `gdd2` GDD
      - `genres` string[]
      - `platform` string
      - `art_style` string
      - `perspective` string
      - `aspect_ratio` string
      - `step_choices` StepValue[]
        - `step` string
        - `description` string
        - `value` string
        - `score` LudoScore
          - `metrics` LudoScoreMetric[]
            - `_max_similarity` number, double
            - `_min_similarity` number, double
            - `description` string
            - `key` string
            - `name` string
            - `score` number, double
            - `supporting_games_title` string
            - `supporting_games` string[]
            - `core_metric` boolean
            - `plotly_plot` PlotlyPlot
              - …
            - `insights` LudoScoreInsight[]
              - …
          - `params` string
          - `score_text` string
          - `score_unit` string
          - `score` number, double
          - `timestamp` integer
          - `country` string
          - `sources` string[]
          - `version` string
          - `badge` LudoScoreBadge
            - `description` string
            - `icon_url` string
            - `key` string
            - `name` string
          - `insights` LudoScoreInsight[]
            - `tag` string
            - `text` string
      - `score` LudoScore
        - `metrics` LudoScoreMetric[]
          - `_max_similarity` number, double
          - `_min_similarity` number, double
          - `description` string
          - `key` string
          - `name` string
          - `score` number, double
          - `supporting_games_title` string
          - `supporting_games` string[]
          - `core_metric` boolean
          - `plotly_plot` PlotlyPlot
            - `data` PlotlyPlotData[]
              - …
            - `layout` PlotlyPlotData
              - …
          - `insights` LudoScoreInsight[]
            - `tag` string
            - `text` string
        - `params` string
        - `score_text` string
        - `score_unit` string
        - `score` number, double
        - `timestamp` integer
        - `country` string
        - `sources` string[]
        - `version` string
        - `badge` LudoScoreBadge
          - `description` string
          - `icon_url` string
          - `key` string
          - `name` string
        - `insights` LudoScoreInsight[]
          - `tag` string
          - `text` string
      - `header` 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
      - `icon` 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
      - `sections` GDDSection[]
        - `id` string
        - `name` string
        - `date` integer
        - `loading` integer
        - `pending` boolean
        - `value` GDDSectionValue
          - `text` string
          - `country` string
          - `title` string
          - `layout` string
          - `imageType` string
          - `images` 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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `assets` ThreeDAsset[]
            - `tags` string[]
            - `asset` AssetGeneration
              - …
            - `image` GameImage
              - …
            - `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.
              - …
          - `games` string[]
          - `elements` GeneratedText[]
            - `id` string
            - `request_id` string
            - `image` GameImage
              - …
            - `images` GameImage[]
              - …
            - `context_keywords` string[]
            - `text` string
            - `title` string
            - `type` string
            - `image_prompt` string
            - `final_score` number, float
          - `comments` GDDComment[]
            - `_id` string
            - `author_id` string
            - `author_email` string
            - `date` integer
            - `text` string
            - `section` string
            - `archived` boolean
            - `replies` GDDComment[]
          - `score` LudoScore
            - `metrics` LudoScoreMetric[]
              - …
            - `params` string
            - `score_text` string
            - `score_unit` string
            - `score` number, double
            - `timestamp` integer
            - `country` string
            - `sources` string[]
            - `version` string
            - `badge` LudoScoreBadge
              - …
            - `insights` LudoScoreInsight[]
              - …
    - `gdd3` GDD3
      - `project_id` string
      - `title` string
      - `elements` GDDElement[]
        - `id` string, uuid, required
        - `type` string, required
        - `title` string
        - `sub_title` string
        - `text` string
        - `mod_date` integer
        - `media` GDDMedia[]
          - `id` string, required
          - `type` 'image' | 'three_d_asset' | 'video' | 'spritesheet' | 'game_id' | 'audio', required
          - `uploaded` 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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `three_d_asset` ThreeDAsset
            - `tags` string[]
            - `asset` AssetGeneration
              - …
            - `image` GameImage
              - …
            - `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.
              - …
          - `video` GeneratedVideo
            - `tags` string[]
            - `id` string
            - `original_prompt` string
            - `prompt` string
            - `url` string
            - `image` GameImage
              - …
            - `pil_image` PILImage
              - …
            - `seed` integer
            - `duration` number, float
            - `has_audio` boolean
            - `model` string
          - `spritesheet` Spritesheet
            - `tags` string[]
            - `id` string
            - `audio_b64` string
            - `duration` number, float
            - `start_timestamp` number
            - `end_timestamp` number
            - `num_frames` number
            - `max_num_frames` number
            - `margin_ratio` number
            - `margin_ratio_horizontal` number, float
            - `margin_ratio_vertical` number, float
            - `margin_ratio_mode` string
            - `target_frame_size` number
            - `loop` boolean
            - `bad_loop` boolean
            - `out_of_frame` boolean
            - `crop` boolean
            - `original_prompt` string
            - `motion_prompt` string
            - `prompt` string
            - `seed` number
            - `sprite_sheet` PILImage
              - …
            - `sprite_sheet_b64` string
            - `sprite_sheet_raw_b64` string
            - `video` GeneratedVideo
              - …
            - `preview_video_b64` string
            - `first_frame_b64` string
            - `last_frame_b64` string
            - `image` GameImage
              - …
            - `middle_image` GameImage
              - …
            - `final_image` GameImage
              - …
            - `has_audio` boolean
            - `is_edited` boolean — True when this spritesheet was produced by an edit (prompt, outpaint, or fix_loop) — the whole animation was re-rendered, so frames may drift from the original.
            - `label` string
            - `preview_scale` number, float
            - `pack_alignment` PackAlignment
              - …
          - `audio` GeneratedAudio
            - `tags` string[]
            - `id` string
            - `audio_b64` string
            - `original_prompt` string
            - `original_text` string
            - `prompt` string
            - `text` string
            - `sample_url` string
            - `seed` integer
            - `type` string
            - `loop` boolean
            - `duration` number, float
            - `voice_preset` VoicePreset
              - …
          - `placeholder` GDDPlaceholder
            - `id` string, uuid
            - `type` string
          - `game_id` string
          - `loading` boolean
        - `loading` integer
        - `pending` boolean
        - `collapsed` boolean
        - `country` string
      - `icon` GDDMedia
        - `id` string, required
        - `type` 'image' | 'three_d_asset' | 'video' | 'spritesheet' | 'game_id' | 'audio', required
        - `uploaded` 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
        - `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
              - …
          - `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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `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
        - `video` GeneratedVideo
          - `tags` string[]
          - `id` string
          - `original_prompt` string
          - `prompt` string
          - `url` 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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `pil_image` PILImage
            - `format` string
            - `format_description` string
          - `seed` integer
          - `duration` number, float
          - `has_audio` boolean
          - `model` string
        - `spritesheet` Spritesheet
          - `tags` string[]
          - `id` string
          - `audio_b64` string
          - `duration` number, float
          - `start_timestamp` number
          - `end_timestamp` number
          - `num_frames` number
          - `max_num_frames` number
          - `margin_ratio` number
          - `margin_ratio_horizontal` number, float
          - `margin_ratio_vertical` number, float
          - `margin_ratio_mode` string
          - `target_frame_size` number
          - `loop` boolean
          - `bad_loop` boolean
          - `out_of_frame` boolean
          - `crop` boolean
          - `original_prompt` string
          - `motion_prompt` string
          - `prompt` string
          - `seed` number
          - `sprite_sheet` PILImage
            - `format` string
            - `format_description` string
          - `sprite_sheet_b64` string
          - `sprite_sheet_raw_b64` string
          - `video` GeneratedVideo
            - `tags` string[]
            - `id` string
            - `original_prompt` string
            - `prompt` string
            - `url` string
            - `image` GameImage
              - …
            - `pil_image` PILImage
              - …
            - `seed` integer
            - `duration` number, float
            - `has_audio` boolean
            - `model` string
          - `preview_video_b64` string
          - `first_frame_b64` string
          - `last_frame_b64` 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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `middle_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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `final_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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `has_audio` boolean
          - `is_edited` boolean — True when this spritesheet was produced by an edit (prompt, outpaint, or fix_loop) — the whole animation was re-rendered, so frames may drift from the original.
          - `label` string
          - `preview_scale` number, float
          - `pack_alignment` PackAlignment
            - `description` string
            - `sizeHeightPx` number, float
            - `groundOffset` number, float
            - `horizontalOffset` number, float
        - `audio` GeneratedAudio
          - `tags` string[]
          - `id` string
          - `audio_b64` string
          - `original_prompt` string
          - `original_text` string
          - `prompt` string
          - `text` string
          - `sample_url` string
          - `seed` integer
          - `type` string
          - `loop` boolean
          - `duration` number, float
          - `voice_preset` VoicePreset
            - `id` string
            - `language` string
            - `emotion` string
        - `placeholder` GDDPlaceholder
          - `id` string, uuid
          - `type` string
        - `game_id` string
        - `loading` boolean
      - `header` GDDMedia
        - `id` string, required
        - `type` 'image' | 'three_d_asset' | 'video' | 'spritesheet' | 'game_id' | 'audio', required
        - `uploaded` 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
        - `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
              - …
          - `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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `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
        - `video` GeneratedVideo
          - `tags` string[]
          - `id` string
          - `original_prompt` string
          - `prompt` string
          - `url` 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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `pil_image` PILImage
            - `format` string
            - `format_description` string
          - `seed` integer
          - `duration` number, float
          - `has_audio` boolean
          - `model` string
        - `spritesheet` Spritesheet
          - `tags` string[]
          - `id` string
          - `audio_b64` string
          - `duration` number, float
          - `start_timestamp` number
          - `end_timestamp` number
          - `num_frames` number
          - `max_num_frames` number
          - `margin_ratio` number
          - `margin_ratio_horizontal` number, float
          - `margin_ratio_vertical` number, float
          - `margin_ratio_mode` string
          - `target_frame_size` number
          - `loop` boolean
          - `bad_loop` boolean
          - `out_of_frame` boolean
          - `crop` boolean
          - `original_prompt` string
          - `motion_prompt` string
          - `prompt` string
          - `seed` number
          - `sprite_sheet` PILImage
            - `format` string
            - `format_description` string
          - `sprite_sheet_b64` string
          - `sprite_sheet_raw_b64` string
          - `video` GeneratedVideo
            - `tags` string[]
            - `id` string
            - `original_prompt` string
            - `prompt` string
            - `url` string
            - `image` GameImage
              - …
            - `pil_image` PILImage
              - …
            - `seed` integer
            - `duration` number, float
            - `has_audio` boolean
            - `model` string
          - `preview_video_b64` string
          - `first_frame_b64` string
          - `last_frame_b64` 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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `middle_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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `final_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
              - …
            - `pil_image` PILImage
              - …
            - `nsfw` number, float
            - `pose` SpritePose
              - …
          - `has_audio` boolean
          - `is_edited` boolean — True when this spritesheet was produced by an edit (prompt, outpaint, or fix_loop) — the whole animation was re-rendered, so frames may drift from the original.
          - `label` string
          - `preview_scale` number, float
          - `pack_alignment` PackAlignment
            - `description` string
            - `sizeHeightPx` number, float
            - `groundOffset` number, float
            - `horizontalOffset` number, float
        - `audio` GeneratedAudio
          - `tags` string[]
          - `id` string
          - `audio_b64` string
          - `original_prompt` string
          - `original_text` string
          - `prompt` string
          - `text` string
          - `sample_url` string
          - `seed` integer
          - `type` string
          - `loop` boolean
          - `duration` number, float
          - `voice_preset` VoicePreset
            - `id` string
            - `language` string
            - `emotion` string
        - `placeholder` GDDPlaceholder
          - `id` string, uuid
          - `type` string
        - `game_id` string
        - `loading` boolean
      - `genres` string[]
      - `platform` string
      - `country` string
      - `art_style` string
      - `perspective` string
      - `aspect_ratio` string
      - `step_choices` StepValue[]
        - `step` string
        - `description` string
        - `value` string
        - `score` LudoScore
          - `metrics` LudoScoreMetric[]
            - `_max_similarity` number, double
            - `_min_similarity` number, double
            - `description` string
            - `key` string
            - `name` string
            - `score` number, double
            - `supporting_games_title` string
            - `supporting_games` string[]
            - `core_metric` boolean
            - `plotly_plot` PlotlyPlot
              - …
            - `insights` LudoScoreInsight[]
              - …
          - `params` string
          - `score_text` string
          - `score_unit` string
          - `score` number, double
          - `timestamp` integer
          - `country` string
          - `sources` string[]
          - `version` string
          - `badge` LudoScoreBadge
            - `description` string
            - `icon_url` string
            - `key` string
            - `name` string
          - `insights` LudoScoreInsight[]
            - `tag` string
            - `text` string
      - `score` LudoScore
        - `metrics` LudoScoreMetric[]
          - `_max_similarity` number, double
          - `_min_similarity` number, double
          - `description` string
          - `key` string
          - `name` string
          - `score` number, double
          - `supporting_games_title` string
          - `supporting_games` string[]
          - `core_metric` boolean
          - `plotly_plot` PlotlyPlot
            - `data` PlotlyPlotData[]
              - …
            - `layout` PlotlyPlotData
              - …
          - `insights` LudoScoreInsight[]
            - `tag` string
            - `text` string
        - `params` string
        - `score_text` string
        - `score_unit` string
        - `score` number, double
        - `timestamp` integer
        - `country` string
        - `sources` string[]
        - `version` string
        - `badge` LudoScoreBadge
          - `description` string
          - `icon_url` string
          - `key` string
          - `name` string
        - `insights` LudoScoreInsight[]
          - `tag` string
          - `text` string
  - `genres` string[]
  - `generationStyles` string[]
  - `generationStylesDetails` GeneratorOption[]
    - `id` string
    - `description` string
    - `name` string
    - `url` string
  - `generationTypes` string[]
  - `generationTypesStandalone` GeneratorOption[]
    - `id` string
    - `description` string
    - `name` string
    - `url` string
  - `generationTypes3d` string[]
  - `componentGroups` ComponentGroup[]
    - `components` ComponentInfo[]
      - `description` string
      - `group` string
      - `hide` boolean
      - `images_by_default` boolean
      - `multiple_allowed` string
      - `section` string
      - `label` string
      - `followups` boolean
      - `gameElements` boolean
      - `chat` boolean
      - `related` string[]
    - `description` string
    - `name` string
    - `title` string
  - `componentList` ComponentInfo[]
    - `description` string
    - `group` string
    - `hide` boolean
    - `images_by_default` boolean
    - `multiple_allowed` string
    - `section` string
    - `label` string
    - `followups` boolean
    - `gameElements` boolean
    - `chat` boolean
    - `related` string[]
  - `gddPacks` GDDPack[]
    - `components` GDDPackComponent[]
      - `n` integer
      - `type` string
      - `title` string
    - `description` string
    - `name` string
    - `title` string
  - `colors` ColorFilter[]
    - `name` string
    - `rgb` integer[]
  - `styles` string[]
  - `platforms` string[]
  - `perspectives` string[]
  - `perspectivesDetails` GeneratorOption[]
    - `id` string
    - `description` string
    - `name` string
    - `url` string
  - `teams` Team[]
    - `_id` string
    - `name` string
    - `subscription_id` string
    - `owner_id` string
    - `users` TeamUser[]
      - `user_id` string
      - `role` 'owner' | 'editor'
      - `subscription_id` string
    - `invitations` TeamInvitation[]
      - `email` string
      - `role` 'editor'
    - `slack_token` boolean
  - `health` boolean
  - `credits` GenerationCreditsInfo
    - `current` number, float
    - `max` number, float
    - `reset_date` integer
    - `extra` number, float
    - `total` number, float
    - `paused` boolean
    - `has_tier_logic` boolean
    - `uses_team_credits` boolean
    - `credits_upfront` boolean
    - `grace_until` integer — If set, the user's subscription ended and their remaining credits stay spendable until this unix timestamp (30-day grace period)
    - `grace_reason` string — Stripe cancellation_details.reason at termination (e.g. cancellation_requested, payment_failed)
  - `plans` PaymentPlan[]
    - `id` string, required
    - `object` string
    - `description` string
    - `amount` integer
    - `statement_descriptor` string
    - `trial_period_days` integer
    - `created` integer
    - `currency` string
    - `interval` string
    - `interval_count` integer
    - `livemode` boolean
    - `active` boolean
    - `billing_scheme` string
    - `product` string
    - `name` string
    - `usage_type` string
    - `nickname` string
    - `amount_off` integer
    - `percent_off` integer
    - `metadata` PaymentPlanMetadata
      - `projects` string
      - `description` string
      - `seats` string
      - `favorites` string
      - `team` string
      - `amount_text` string
      - `credits` string
      - `premium` string
      - `magic_link` string
      - `api` string
      - `rate_limits` string
      - `queue_concurrency` string
  - `loading_tips` LoadingTip[]
    - `label` string
    - `index` string
    - `video_url` string
    - `tips` LoadingTipContent[]
      - `text` string
  - `documentation` Documentation[]
    - `index` string
    - `label` string
    - `section` DocumentationSection[]
      - `title` string
      - `content` string
  - `whats_new` WhatsNew[]
    - `id` string
    - `date` integer
    - `title` string
    - `hqTitle` string
    - `hqThumb` string
    - `hqText` string
    - `toolLabel` string
    - `toolUrl` string
  - `generation_steps` GenerationStep[]
    - `allow_input` boolean
    - `fixed_options` boolean
    - `description` string
    - `key` string
    - `name` string
  - `credit_costs` CreditFeature[]
    - `id` string
    - `name` string
    - `category` FeatureCategory
      - `id` string
      - `name` string
      - `description` string
    - `indie_cost` string — Cost for Indie plan (number or "Unlimited")
    - `pro_studio_cost` string — Cost for Pro/Studio plans (number or "Unlimited")
    - `variable` boolean
    - `tooltip` string — Optional tooltip explaining cost calculation
  - `voice_presets` VoicePresetList
    - `ids` string[]
    - `languages` string[]
    - `emotions` string[]

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