{"server":"ai.ludo/game-assets","count":50,"changes":[{"tool":"create3DModelImage","kind":"added","observed_at":"2026-10-19T17:33:56.850Z","fields":[],"description_before":null,"description_after":"Make a character image ready to turn into a 3D model, the first step of Directional Sprites on the web. Pass a prompt describing the character, your own image (URL or base64), or both. With an image, it is redrawn as a 3D render, and the prompt becomes the changes to make (e.g. \"add a red cape and a sword\"); leave the prompt out to keep the character as it is. A redraw is a new picture each time, so call again for another try. The job result is a single image result with a url (not an array): pass that url as create3DModel's image. create3DModel itself converts the image it is given as it is. A call with neither prompt nor image is rejected with HTTP 400, and an image larger than 15MB too. Credits are held when the job is accepted and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can retrieve it later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.5 credits per result.","description_similarity":null,"before_hash":null,"after_hash":"55c364f2e732ffeae1b4cd33949b0bdb"},{"tool":"create3DModel","kind":"changed","observed_at":"2026-10-19T17:33:56.850Z","fields":["description"],"description_before":"Convert a source image into a textured 3D model (image-to-3D). The job result is a downloadable GLB model_url plus an array of snapshot image URLs rendered from different angles (handy for previews). model picks the generator: prop (default) is low-cost and suits everyday props and environment pieces; hero is far more detailed and accurate, for close-up assets, but slower and more expensive. image is the front view; with prop, pass an optional back_image (the same subject seen from behind) so the back of the model follows it instead of being invented - hero takes the front image only and rejects a back_image with HTTP 400. Accepts optional mesh controls: target_num_faces (max triangle count, 1000-200000, default 50000), texture_size (1024 or 2048, default 2048), and texture_type (\"pbr\", \"simple\", or \"none\", default \"pbr\"). Pass rig true to also rig the model in the same call, with the general rig (joint_naming as in rigModel), ready for animate3DModelPreset or createDirectionalSprites; that adds the rigModel price, charged only when the result comes back rigged. Credits are held when the job is accepted and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type 3d). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 4 credits per call with model \"prop\" (default), 15 credits per call with model \"hero\"; rig true adds 1 credit when the model comes back rigged.","description_after":"Convert a source image into a textured 3D model (image-to-3D). The job result is a downloadable GLB model_url plus an array of snapshot image URLs rendered from different angles (handy for previews). model picks the generator: prop (default) is low-cost and suits everyday props and environment pieces; hero is far more detailed and accurate, for close-up assets, but slower and more expensive. image is the front view; with prop, pass an optional back_image (the same subject seen from behind) so the back of the model follows it instead of being invented - hero takes the front image only and rejects a back_image with HTTP 400. The image is converted as it is: to make a character image for it first, from a prompt or by redrawing your own image as a 3D render, use create3DModelImage. Accepts optional mesh controls: target_num_faces (max triangle count, 1000-200000, default 50000), texture_size (1024 or 2048, default 2048), and texture_type (\"pbr\", \"simple\", or \"none\", default \"pbr\"). Pass rig true to also rig the model in the same call, with the general rig (joint_naming as in rigModel), ready for animate3DModelPreset or createDirectionalSprites; that adds the rigModel price, charged only when the result comes back rigged. Credits are held when the job is accepted and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type 3d). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 4 credits per call with model \"prop\" (default), 15 credits per call with model \"hero\"; rig true adds 1 credit when the model comes back rigged.","description_similarity":0.925,"before_hash":"56b21a38aab35d12443a4e57d737daaa","after_hash":"d21b6e0ec075159d5ff3d4d7fd2db118"},{"tool":"editImage","kind":"changed","observed_at":"2026-10-19T11:35:38.468Z","fields":["description","inputSchema"],"description_before":"Modify an existing image according to text instructions: supply a source image (URL or base64) and a prompt describing the changes (e.g. \"add clouds\", \"warmer color scheme\"), with an optional reference_image for extra style or content guidance. To change only one area, pass a mask (white = change, black = keep, the same size as the image): mask_mode \"replace\" (default) redraws that area from the prompt, \"erase\" removes what is there. Without a mask the whole image is re-rendered. The job result is an array of image results, each with a url; request n (1-4) to control the number of edited variations. Provided images are uploaded and validated, and any image larger than 15MB is rejected with HTTP 400. Credits are held when the job is accepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use editImage to transform a specific existing image; use createImage to generate from text alone, generateWithStyle to borrow a reference's art style, and removeBackground for the dedicated background-removal case. Pass an optional request_id to tag the results so you can retrieve them later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.5 credits per result; 1 credit per result with a mask.","description_after":"Modify an existing image according to text instructions: supply a source image (URL or base64) and a prompt describing the changes (e.g. \"add clouds\", \"warmer color scheme\"), with an optional reference_image for extra style or content guidance. To change only one area, pass a mask (white = change, black = keep, the same size as the image): mask_mode \"replace\" (default) redraws that area from the prompt, \"erase\" removes what is there. Without a mask the whole image is re-rendered. Never ask for a transparent background in the prompt: it often comes back as a grey-and-white checkerboard painted into the pixels, which removeBackground cannot remove. A sprite keeps its transparency without being asked (see image_type). The job result is an array of image results, each with a url; request n (1-4) to control the number of edited variations. Provided images are uploaded and validated, and any image larger than 15MB is rejected with HTTP 400. Credits are held when the job is accepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use editImage to transform a specific existing image; use createImage to generate from text alone, generateWithStyle to borrow a reference's art style, and removeBackground for the dedicated background-removal case. Pass an optional request_id to tag the results so you can retrieve them later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.5 credits per result; 1 credit per result with a mask.","description_similarity":0.871,"before_hash":"7e8df819dff32d29b5f8075dba93c80e","after_hash":"36832ece6d4d28ba005fb9861fd84698"},{"tool":"editImage","kind":"changed","observed_at":"2026-10-18T23:19:42.902Z","fields":["description","inputSchema"],"description_before":"Modify an existing image according to text instructions: supply a source image (URL or base64) and a prompt describing the changes (e.g. \"add clouds\", \"warmer color scheme\"), with an optional reference_image for extra style or content guidance. The job result is an array of image results, each with a url; request n (1-4) to control the number of edited variations. Provided images are uploaded and validated, and any image larger than 15MB is rejected with HTTP 400. Credits are held when the job is accepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use editImage to transform a specific existing image; use createImage to generate from text alone, generateWithStyle to borrow a reference's art style, and removeBackground for the dedicated background-removal case. Pass an optional request_id to tag the results so you can retrieve them later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.5 credits per result.","description_after":"Modify an existing image according to text instructions: supply a source image (URL or base64) and a prompt describing the changes (e.g. \"add clouds\", \"warmer color scheme\"), with an optional reference_image for extra style or content guidance. To change only one area, pass a mask (white = change, black = keep, the same size as the image): mask_mode \"replace\" (default) redraws that area from the prompt, \"erase\" removes what is there. Without a mask the whole image is re-rendered. The job result is an array of image results, each with a url; request n (1-4) to control the number of edited variations. Provided images are uploaded and validated, and any image larger than 15MB is rejected with HTTP 400. Credits are held when the job is accepted and refunded if it fails or is cancelled; the charge scales with the number of images produced. Use editImage to transform a specific existing image; use createImage to generate from text alone, generateWithStyle to borrow a reference's art style, and removeBackground for the dedicated background-removal case. Pass an optional request_id to tag the results so you can retrieve them later via listGenerations (type image). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.5 credits per result; 1 credit per result with a mask.","description_similarity":0.831,"before_hash":"3f29607eb7e092d4981c37b6a0be2e19","after_hash":"7e8df819dff32d29b5f8075dba93c80e"},{"tool":"animate3DModelPreset","kind":"changed","observed_at":"2026-10-17T00:10:16.635Z","fields":["description"],"description_before":"Apply a curated animation preset to an already-rigged 3D model (retargeting). Pass the rigged GLB in `model` (URL or base64; the 3D asset file, not an AI model name) and a `preset_id` from the animation presets list (from listAnimationPresets; any preset id works). Any rig type can take a preset, though retargeting does not succeed on every model: when it does not, the job fails. The job result is one retargeted animation - a standalone animation-only GLB in `glb_url` plus an mp4 `preview_url` - in the same `animations` envelope as the animate endpoint. crop_loop trims the clip to its seamlessly-looping span (omit to follow the preset's own loop flag); in_place removes net travel so the character moves on the spot, as game-engine locomotion expects (omit to keep the preset's own travel). Credits are held when the job is accepted and refunded if it fails or is cancelled. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.2 credits per call.","description_after":"Apply a curated animation preset to an already-rigged 3D model (retargeting). Pass the rigged GLB in `model` (URL or base64; the 3D asset file, not an AI model name) and a `preset_id` from the animation presets list (from listAnimationPresets; any preset id works). Any rig type can take a preset, though retargeting does not succeed on every model: when it does not, the job fails. The job result is one retargeted animation - a standalone animation-only GLB in `glb_url` plus an mp4 `preview_url` - in the same `animations` envelope as the animate endpoint. crop_loop trims the clip to its seamlessly-looping span (omit to follow the preset's own loop flag); in_place removes net travel so the character moves on the spot, as game-engine locomotion expects (omit to keep the preset's own travel). Credits are held when the job is accepted and refunded if it fails or is cancelled. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.5 credits per call.","description_similarity":0.982,"before_hash":"ea704c13b24bd3053fa170420a4dc654","after_hash":"8a268499289db2c1590bbdd84e368028"},{"tool":"animate3DModel","kind":"changed","observed_at":"2026-10-17T00:10:16.635Z","fields":["description"],"description_before":"Generate text-driven skeletal animations for an already-rigged 3D model. Pass the rigged GLB in `model` (URL or base64; the 3D asset file, not an AI model name) and a motion `prompt` (e.g. \"walking\", \"swinging its axe\"). The model must already have a skeleton - rig it first with rigModel if not. The job result is num_variants candidate animations (default 4), each a standalone animation-only GLB (skeleton + one clip, no mesh) in `glb_url` plus an mp4 `preview_url`, so you can pick the best one and fuse it with your model in a game engine or three.js. mode selects the representation - rot_trans (default, rotation plus translation per bone, most faithful) or rot_only (rotation only, easier to retarget onto another skeleton in an engine). Animation quality is hit-or-miss, which is why multiple candidates are returned. Credits are held once per call regardless of variant count and refunded if the job fails or is cancelled. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.2 credits per call.","description_after":"Generate text-driven skeletal animations for an already-rigged 3D model. Pass the rigged GLB in `model` (URL or base64; the 3D asset file, not an AI model name) and a motion `prompt` (e.g. \"walking\", \"swinging its axe\"). The model must already have a skeleton - rig it first with rigModel if not. The job result is num_variants candidate animations (default 4), each a standalone animation-only GLB (skeleton + one clip, no mesh) in `glb_url` plus an mp4 `preview_url`, so you can pick the best one and fuse it with your model in a game engine or three.js. mode selects the representation - rot_trans (default, rotation plus translation per bone, most faithful) or rot_only (rotation only, easier to retarget onto another skeleton in an engine). Animation quality is hit-or-miss, which is why multiple candidates are returned. Credits are held once per call regardless of variant count and refunded if the job fails or is cancelled. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.5 credits per call.","description_similarity":0.984,"before_hash":"9445762ddebd41b1ba6290438e6eec36","after_hash":"48be0177ac7dede3c2bfc5781cb7e5c3"},{"tool":"submitApiFeedback","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"ce88277654cd69b1b42cea7a7402e5b6","after_hash":"e90f62e158a24941b179440e6ec45039"},{"tool":"getAccount","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"90832c029bbd026e9cb90e8e3f32b8f1","after_hash":"ad8f2b689c98bcb70168e55adbfe7544"},{"tool":"cancelApiJob","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"2bd6084b8c5a7fbd8d378cbc077f0239","after_hash":"c8f9e0cdbb7be93c3b4efe15fe9260f7"},{"tool":"getApiJob","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"2afc6abb60b9f2f6b9d8e522b1bf7d1f","after_hash":"96a1eae72fe9718621a1327c1ea4e2b0"},{"tool":"listApiJobs","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"c238512eebc230b3303d3a5c13330623","after_hash":"39e27163bae74e5997a0be352b6ee523"},{"tool":"listGenerations","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"e91ffdf7b3607c3bfee30ec1573d2d5e","after_hash":"3a6e6a43c687ff264b845812b7d8b224"},{"tool":"createSpeechPreset","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"441f7105959988c7ba733dc4f0542b0a","after_hash":"c622542d71308239c40ca33385ff559d"},{"tool":"createSpeech","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"2fa8aa9caa4e58b102fcb36fadb14ae6","after_hash":"aa5c0ebe7674d94ab9818be6c302d936"},{"tool":"createVoice","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"c1e1b30b6f84d62a2e8dad383b428534","after_hash":"e89b3c70bcd5e72982ca5b68eb5c3d77"},{"tool":"createAudioTransform","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"f3118ceb23878de162ef6d91556aa075","after_hash":"4772c0533b3af4e5e85d02b22d60b75f"},{"tool":"createMusic","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"c1220e3c529c47219c42f97f7e9ce35b","after_hash":"2d7aefeccdbe36b7a9f8cc6f41c2145e"},{"tool":"createAmbiance","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"5ab20083e7682fbc34b88f08ed1993f7","after_hash":"c307830c5b659ac584109a6a563a32af"},{"tool":"createSoundEffect","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"8f837b0c54edf84ad1258d1768f1102a","after_hash":"ce89d441252899ad82f46771816f3618"},{"tool":"animate3DModelPreset","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","description","inputSchema","annotations"],"description_before":"Apply a curated animation preset to an already-rigged 3D model (retargeting). Pass the rigged GLB in `model` (URL or base64; the 3D asset file, not an AI model name) and a `preset_id` from the animation presets list (from listAnimationPresets; any preset id works). The model must have a humanoid-template rig (rig it with rig_type humanoid_template or humanoid_template_hands). The job result is one retargeted animation - a standalone animation-only GLB in `glb_url` plus an mp4 `preview_url` - in the same `animations` envelope as the animate endpoint. crop_loop trims the clip to its seamlessly-looping span (omit to follow the preset's own loop flag); in_place removes net travel so the character moves on the spot, as game-engine locomotion expects (omit to keep the preset's own travel). Credits are held when the job is accepted and refunded if it fails or is cancelled. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.2 credits per call.","description_after":"Apply a curated animation preset to an already-rigged 3D model (retargeting). Pass the rigged GLB in `model` (URL or base64; the 3D asset file, not an AI model name) and a `preset_id` from the animation presets list (from listAnimationPresets; any preset id works). Any rig type can take a preset, though retargeting does not succeed on every model: when it does not, the job fails. The job result is one retargeted animation - a standalone animation-only GLB in `glb_url` plus an mp4 `preview_url` - in the same `animations` envelope as the animate endpoint. crop_loop trims the clip to its seamlessly-looping span (omit to follow the preset's own loop flag); in_place removes net travel so the character moves on the spot, as game-engine locomotion expects (omit to keep the preset's own travel). Credits are held when the job is accepted and refunded if it fails or is cancelled. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 0.2 credits per call.","description_similarity":0.897,"before_hash":"582be9b4274bdd9d029b5e60d6c06f09","after_hash":"ea704c13b24bd3053fa170420a4dc654"},{"tool":"animate3DModel","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"9f8c6aa3bf922b84b3be96631580dd8a","after_hash":"9445762ddebd41b1ba6290438e6eec36"},{"tool":"rigModel","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","description","inputSchema","annotations"],"description_before":"Rig a 3D model: generate a skeleton and skin weights for an existing GLB so it can be animated. Accepts a URL or base64-encoded GLB in `model` (here `model` is the 3D asset file, not an AI model name - rigging has no model choice). The job result is a downloadable `model_url` for the rigged GLB. rig_type selects the skeleton prior - general (default, any asset), humanoid (anime-style characters), game (classic game-character rigs), or the pinned humanoid templates for two-armed, two-legged characters: humanoid_template (standard 22-joint skeleton with named joints, required for animating from the preset library) and humanoid_template_hands (52 joints, five fingers per hand). joint_naming relabels the identified joints to a convention - smpl (default), mixamo, humanik, unreal, godot, rigify, or vroid - without changing the skeleton. Credits are held when the job is accepted and refunded if it fails or is cancelled. Rigging is non-destructive to geometry but replaces any prior skeleton, so animations made against an old rig no longer apply. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 1 credits per call.","description_after":"Rig a 3D model: generate a skeleton and skin weights for an existing GLB so it can be animated. Accepts a URL or base64-encoded GLB in `model` (here `model` is the 3D asset file, not an AI model name - rigging has no model choice). The job result is a downloadable `model_url` for the rigged GLB. rig_type selects the skeleton prior - general (default, any asset), humanoid (anime-style characters), game (classic game-character rigs), or the pinned humanoid templates for two-armed, two-legged characters: humanoid_template (standard 22-joint skeleton with named joints) and humanoid_template_hands (52 joints, five fingers per hand). Animation presets retarget onto any rig type, though not onto every model. joint_naming relabels the identified joints to a convention - smpl (default), mixamo, humanik, unreal, godot, rigify, or vroid - without changing the skeleton. Credits are held when the job is accepted and refunded if it fails or is cancelled. Rigging is non-destructive to geometry but replaces any prior skeleton, so animations made against an old rig no longer apply. Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 1 credits per call.","description_similarity":0.918,"before_hash":"c6be90e3da63d373b2965e67cdc6fd1f","after_hash":"6cb317ae30466d3e44024c4a1589168e"},{"tool":"create3DModel","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","description","inputSchema","annotations"],"description_before":"Convert a source image into a textured 3D model (image-to-3D). The job result is a downloadable GLB model_url plus an array of snapshot image URLs rendered from different angles (handy for previews). model picks the generator: prop (default) is low-cost and suits everyday props and environment pieces; hero is far more detailed and accurate, for close-up assets, but slower and more expensive. image is the front view; with prop, pass an optional back_image (the same subject seen from behind) so the back of the model follows it instead of being invented - hero takes the front image only and rejects a back_image with HTTP 400. Accepts optional mesh controls: target_num_faces (max triangle count, 1000-200000, default 50000), texture_size (1024 or 2048, default 2048), and texture_type (\"pbr\", \"simple\", or \"none\", default \"pbr\"). Pass rig true to also rig the model in the same call (rig_type and joint_naming as in rigModel), ready for animate3DModelPreset or createDirectionalSprites; that adds the rigModel price, charged only when the result comes back rigged. Credits are held when the job is accepted and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type 3d). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 4 credits per call with model \"prop\" (default), 15 credits per call with model \"hero\"; rig true adds 1 credit when the model comes back rigged.","description_after":"Convert a source image into a textured 3D model (image-to-3D). The job result is a downloadable GLB model_url plus an array of snapshot image URLs rendered from different angles (handy for previews). model picks the generator: prop (default) is low-cost and suits everyday props and environment pieces; hero is far more detailed and accurate, for close-up assets, but slower and more expensive. image is the front view; with prop, pass an optional back_image (the same subject seen from behind) so the back of the model follows it instead of being invented - hero takes the front image only and rejects a back_image with HTTP 400. Accepts optional mesh controls: target_num_faces (max triangle count, 1000-200000, default 50000), texture_size (1024 or 2048, default 2048), and texture_type (\"pbr\", \"simple\", or \"none\", default \"pbr\"). Pass rig true to also rig the model in the same call, with the general rig (joint_naming as in rigModel), ready for animate3DModelPreset or createDirectionalSprites; that adds the rigModel price, charged only when the result comes back rigged. Credits are held when the job is accepted and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type 3d). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 4 credits per call with model \"prop\" (default), 15 credits per call with model \"hero\"; rig true adds 1 credit when the model comes back rigged.","description_similarity":0.993,"before_hash":"e5e893bb4822a4bc4fadeebb12665cc9","after_hash":"56b21a38aab35d12443a4e57d737daaa"},{"tool":"upscaleImage","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"d2ab7c2bd3c819ad624a31aa1a8ce23c","after_hash":"44364ea7bdedaea10627aac6370405d2"},{"tool":"removeBackground","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"f8f9f3adffaee88ed19935c06776a173","after_hash":"5572139214c6e6c128e7ed66055d1d2e"},{"tool":"upscaleVideo","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"daf7625f95ebd28c453bbe189ce1442c","after_hash":"d63f6eafa71838404c9be2c99bab8fa6"},{"tool":"editVideo","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"8d2c3dbea4203ba467cdd8da9c26716e","after_hash":"abbbfe21f82bcd0f5fd7945260fa1142"},{"tool":"createVideoFromReferences","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"89c0261a1a35be000d2709cef3ddcb9a","after_hash":"41b5e3144eb2c92ccedeea921ba2b1c3"},{"tool":"createVideo","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"cff455f46f04686bcccf4eefa6c63d34","after_hash":"a00e9ceffa5970293a1fc5e72c03219f"},{"tool":"createDirectionalStills","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"8156730cdb9b13bb911135b62fa52dc0","after_hash":"034b91f9bf98fe76ec72a62dc088738c"},{"tool":"createDirectionalSprites","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","description","inputSchema","annotations"],"description_before":"Directional Sprites: render a 3D model into one spritesheet per direction, in a style. Pass the GLB in `model` (URL or base64; rigged, to animate it - see create3DModel with rig, or rigModel) and at most one animation: `animation_url` (the `glb_url` of an animation from animate3DModel or animate3DModelPreset, made for this model), `preset_id` (a preset from listAnimationPresets, retargeted onto the model; needs a humanoid_template or humanoid_template_hands rig) or `model_animation` (the name of an animation the GLB itself carries). With no animation each sheet is a single frame. `directions` are where the camera stands around a character facing S (up to 8); every direction is rendered together, on the same frame size, scale and floor, so the sheets line up. Pick the style with listDirectionalSpriteStyles (style_id, and style_params for its settings) and check it with previewDirectionalSprites first. The job result is one sheet per direction, in the order asked, each with its `spritesheet_url`, grid fields, fps and `render_3d`. Credits are held for every direction when the job is accepted and charged for the sheets that come back; a failed or cancelled job is refunded. Pass an optional request_id to tag the sheets for later retrieval via listGenerations (type spritesheet). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 1 credit per direction (one sheet each).","description_after":"Directional Sprites: render a 3D model into one spritesheet per direction, in a style. Pass the GLB in `model` (URL or base64; rigged, to animate it - see create3DModel with rig, or rigModel) and at most one animation: `animation_url` (the `glb_url` of an animation from animate3DModel or animate3DModelPreset, made for this model), `preset_id` (a preset from listAnimationPresets, retargeted onto the model; any rig type can take one, though retargeting does not succeed on every model, and when it does not the call returns an error) or `model_animation` (the name of an animation the GLB itself carries). With no animation each sheet is a single frame. `directions` are where the camera stands around a character facing S (up to 8); every direction is rendered together, on the same frame size, scale and floor, so the sheets line up. Pick the style with listDirectionalSpriteStyles (style_id, and style_params for its settings) and check it with previewDirectionalSprites first. The job result is one sheet per direction, in the order asked, each with its `spritesheet_url`, grid fields, fps and `render_3d`. Credits are held for every direction when the job is accepted and charged for the sheets that come back; a failed or cancelled job is refunded. Pass an optional request_id to tag the sheets for later retrieval via listGenerations (type spritesheet). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 1 credit per direction (one sheet each).","description_similarity":0.898,"before_hash":"76e26da078882a64d26c4ab367711146","after_hash":"3710095bf25e7c1689678bcfa4e10bd9"},{"tool":"previewDirectionalSprites","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","inputSchema","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"f9b67ae83d7f31bdff5bb2c32faf5123","after_hash":"83d310c247378763321bb0a62c86fe4c"},{"tool":"listDirectionalSpriteStyles","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"ec073a655d1b68f14341387b30a0ef89","after_hash":"2f6b6e13a88f0f01d2d1ce1369ee1fbe"},{"tool":"createSpriteAudio","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"099607d96501f882e9380f02ccc270ac","after_hash":"8cdd858b0abcb41e47bdf9ca49ee881f"},{"tool":"adjustSpritesheet","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"7e4600ba03ca77d3d50db1e8c6eaa2a6","after_hash":"799595a062aa39497707e95d4f54e34c"},{"tool":"rotateSpritesheet","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"71fe847ded7e8099a53a2a6406ac1eca","after_hash":"87e1a4d63bb5b8f6ba023934f25be617"},{"tool":"editSpritesheet","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"77c22a981f9482c9038ca73aa9b1a5b9","after_hash":"053eb86368e33ab6b7b513e2c7074c35"},{"tool":"listAnimationPresets","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"9859aa8ce0ec5129457995d8d733768a","after_hash":"5e68ffd5b62554968c3cfea51bcdeaf2"},{"tool":"searchDocs","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"7f8eec4f8ea70d09d4720612083e4d5a","after_hash":"60fd6373a016aae4ec66920747c6268a"},{"tool":"getDocs","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","inputSchema","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"6b07f85bd266c01bc7b7170189fd1dfa","after_hash":"36ce70257d7b3068b297de89755d1489"},{"tool":"transferMotion","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"b4f658e46cc5c190d56701758c8f23b3","after_hash":"5fad89421d8f32a6077d27b0f1cc6c0c"},{"tool":"rotateSprite","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"6aa0b459e0ba9c4a9b388664e8c3352c","after_hash":"e659f589691db8494d361057bddcff4d"},{"tool":"generatePose","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"d1e09dcefeed14ed88e25b5010c9a2b1","after_hash":"cc5f4f845b18d7be0f55e175122a2030"},{"tool":"animateSpriteKeyframes","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"3485d3c3d32c90938f09cec9add73e4d","after_hash":"a3fc7ddd5e5133f778f8e111d51271ee"},{"tool":"animateSprite","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"f644f58cb9ebb7b3a0bb57d52045ab0f","after_hash":"303a09a529b46c97ba2a9c806d446e07"},{"tool":"editImage","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"13b71f827ab8a7a548006af7d13a3f48","after_hash":"3f29607eb7e092d4981c37b6a0be2e19"},{"tool":"generateWithStyle","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"7c49ed0aa20b1487b3468f87b9989819","after_hash":"6ddbe0b8185b5495bd4870e08b59f6bb"},{"tool":"createImage","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"d7623eb7528cae4ad95644d86715e55e","after_hash":"806296e1c309e81cfe27c762fa437113"},{"tool":"validateApiKeyEndpoint","kind":"changed","observed_at":"2026-10-16T18:08:47.632Z","fields":["title","annotations"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"ebba75209abd9f4255c8dc8a9eb79850","after_hash":"3bd82c84c294ef7b30f619469148bee3"},{"tool":"create3DModel","kind":"changed","observed_at":"2026-10-15T18:09:18.118Z","fields":["description","inputSchema"],"description_before":"Convert a source image into a textured 3D model (image-to-3D). The job result is a downloadable GLB model_url plus an array of snapshot image URLs rendered from different angles (handy for previews). model picks the generator: prop (default) is low-cost and suits everyday props and environment pieces; hero is far more detailed and accurate, for close-up assets, but slower and more expensive. image is the front view; with prop, pass an optional back_image (the same subject seen from behind) so the back of the model follows it instead of being invented - hero takes the front image only and rejects a back_image with HTTP 400. Accepts optional mesh controls: target_num_faces (max triangle count, 1000-200000, default 50000), texture_size (1024 or 2048, default 2048), and texture_type (\"pbr\", \"simple\", or \"none\", default \"pbr\"). Credits are held when the job is accepted and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type 3d). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 4 credits per call with model \"prop\" (default), 15 credits per call with model \"hero\".","description_after":"Convert a source image into a textured 3D model (image-to-3D). The job result is a downloadable GLB model_url plus an array of snapshot image URLs rendered from different angles (handy for previews). model picks the generator: prop (default) is low-cost and suits everyday props and environment pieces; hero is far more detailed and accurate, for close-up assets, but slower and more expensive. image is the front view; with prop, pass an optional back_image (the same subject seen from behind) so the back of the model follows it instead of being invented - hero takes the front image only and rejects a back_image with HTTP 400. Accepts optional mesh controls: target_num_faces (max triangle count, 1000-200000, default 50000), texture_size (1024 or 2048, default 2048), and texture_type (\"pbr\", \"simple\", or \"none\", default \"pbr\"). Pass rig true to also rig the model in the same call (rig_type and joint_naming as in rigModel), ready for animate3DModelPreset or createDirectionalSprites; that adds the rigModel price, charged only when the result comes back rigged. Credits are held when the job is accepted and refunded if it fails or is cancelled. Pass an optional request_id to tag the result so you can locate it later via listGenerations (type 3d). Async generation job: returns `{id, status}` - poll `getApiJob` (job and credit contract: see the server instructions).\n\nCredits: This endpoint consumes 4 credits per call with model \"prop\" (default), 15 credits per call with model \"hero\"; rig true adds 1 credit when the model comes back rigged.","description_similarity":0.878,"before_hash":"af35acaf0ca3f39d0dd4ecc6f8774424","after_hash":"e5e893bb4822a4bc4fadeebb12665cc9"}],"next_before":"775089","next_actions":[{"action":"list_changes","description":"Older changes","href":"/v1/servers/ai.ludo%2Fgame-assets/changes?before=775089&limit=50"}]}