thrixel_account_status
ChatGPTCheck the Thrixel API key, the cube balance, and how many jobs are running. Call this before submitting a large batch so you can size it to the budget and the concurrency cap, and after a 'jobs already running' or 'out of cubes' error. Costs: detail / sculpt / texture are a flat 40 cubes each, plus about 7 more when they are given only a prompt and have to generate the reference image; reduce_triangles and rebake are free; create / edit are metered on actual model usage (tens of cubes, sometimes more). Concurrency is capped per plan; an admin account is unlimited.
thrixel_add_project_source
ChatGPTAttach a text file to the active project. Its contents are given to EVERY generation in that project from then on, so it is where constants live: art direction, polycount budgets, naming conventions, in-world names, real-world sizes. Free. Write this once, early, instead of repeating the same clauses in thirty prompts - a rule repeated by hand is a rule that eventually gets typed differently, and the set drifts. USE IT FOR RULES, NOT FOR LOOKS. This is text, so it is good at things you can state: 'every asset under 5000 triangles', 'flat colours, no gradients', 'never add a ground plane', 'a door is 2.1m tall'. To make assets share an APPEARANCE, pass style_reference_submission_id to thrixel_create_model instead - a finished model shows a palette and a finish far better than a paragraph describes them. The two combine; they do not substitute. Limits: .md / .markdown / .txt / .text, 64 KB per file, 256 KB per project. Uploading the same filename replaces the previous version. Applies only to generations made AFTER the upload; it does not retroactively change existing assets. The contents are read by the model, so put project rules in it and nothing else - no keys, no private notes.
thrixel_cancel_job
ChatGPTCancel a job that is still waiting in the queue. Free. Use it when you no longer want a result: a wrong prompt spotted after submitting, a batch that turned out too large, a queued job you have decided against. Resubmitting instead pays for the same job twice. Only a job that has NOT started can be cancelled. Once a worker has picked it up it runs to the end and is charged as usual; cancelling it is refused, and that is final, not a temporary error. Cancelling something that already completed or failed changes nothing and is not an error.
thrixel_create_model
ChatGPTCreate a 3D model from a text description, optionally guided by reference images. This is the default way to make a game prop, vehicle, building, weapon or piece of furniture. Output is a rough but EDITABLE multi-part mesh: parts are separate, named nodes you can transform, animate or retexture individually. Each part's origin sits at that part's own centre, so a part can be rotated or animated directly with no re-pivoting: right for a rotor, a wheel or a turret. A hinge is the exception - a door or lid wants its pivot on its edge, which you set in your engine. CHOOSE BY ASKING: does any part of this asset have to move on its own? Wheels, sails, turrets, doors, lids, limbs, propellers. If yes, use this tool - it is the ONLY one that produces separate parts, and a merged mesh can never be un-merged afterwards. Follow with thrixel_detail_model if it also has to look finished; the hierarchy survives that pass at the default adherence_level of 9. If nothing needs to move and the subject is organic, thrixel_sculpt_model gives a better result for fewer cubes. Waits for the job to finish, saves the GLB, and returns the file path plus a rendered thumbnail. Look at the thumbnail before building on the result. Describe the object itself, not the request: 'a weathered wooden market stall with a striped awning' works, 'make me a stall' does not. REPEATED SURFACE FEATURES are broken into separate meshes by default. Ask for cooling slots, roof shingles, tyre tread, rivets or scales and you get one mesh per element, which multiplies the part count and, on anything that must be watertight, leaves seams that tear open during thrixel_detail_model. To prevent it, say so in the prompt: "the tread is cut into the tyre's own continuous surface as ONE mesh, not separate blocks or lugs". That single clause is also the fix for the torn seams. SCALE IS NORMALISED: every asset arrives in roughly the same bounding box, so a castle keep and a peasant import the same size. Set the relative scale yourself on import - a castle is not going to look like a castle until you do. TRIANGLE BUDGET: humanoids land around 3-5k triangles, props higher. That is right for a hero asset and wrong for a unit drawn 200x a frame, so if this has a budget, plan the free thrixel_reduce_triangles step in rather than shipping the raw output - 200 characters at 5k is 1M triangles of characters alone. Use 'plus' - the default - unless the user asks otherwise; a regenerated asset costs far more than the gap between the tiers. Where cubes are tight, build fewer assets at Plus rather than more at Balanced. Metered per asset and charged after the run, so it varies with the subject rather than with anything you set. Measured on completed work, Plus costs about 30 cubes for a prop, 35 for a vehicle, 45 for a building and 50 for a character or creature; about one in ten runs past 70, 70, 100 and 130 respectively. Balanced is half the price of Plus on the same asset. Budget from the row that matches what you are about to build, not from one average: a set of characters costs nearly twice what the same number of props costs. Check thrixel_account_status as you go - these are metered, not fixed.
thrixel_detail_model
ChatGPTTurn a rough model into a high-resolution mesh with a PBR texture. Costs 40 cubes and runs on a GPU - expect a couple of minutes. TERMINAL: the result cannot be edited afterwards. thrixel_edit_model refuses a detailed model outright. So get the shape right FIRST with edit_model, which is cheap, and detail once at the end. The natural order - detail it, look at it, fix the worst thing - does not work here, and you only find that out after paying. It regenerates geometry, so it is NOT the way to reduce triangle count: use thrixel_reduce_triangles for that, which is free and faster. BEST ON organic and sculptural subjects: creatures, characters, cloth, plants, rock, worn or hand-made surfaces. It is a poor fit for precision hard-surface geometry - a clean cylinder, torus or wheel is re-approximated rather than refined, so it comes back measurably less round while carrying many times the triangles. IF THE SHAPE IS ALREADY RIGHT, USE thrixel_retexture_model INSTEAD. It gives an existing mesh a new look for the same price and never touches geometry, so every part, name and proportion survives intact. Detailing is for when you want the SHAPE itself to gain detail, and it is the only one of the two that can damage what you already have. There is no reason to risk geometry you are happy with. THE ASSET'S PROPORTIONS MATTER: something whose bounding box is far from a cube - a building, a roof, a floor plane, anything long and thin - comes back noticeably worse, because the object fills only a small part of the working volume. For buildings, prefer thrixel_retexture_model. WHAT IT CAN COST YOU, all worth knowing before the cubes are spent: - It INVENTS form wherever the blockout is vague, so anything you do not name comes back as plausible noise. Hands, faces, buckles and straps are where that shows. Describe every feature you care about, not just the style. - Thin geometry (blades, sails, propellers, thin rods) may not survive, even with preserve_parts. Check the part list afterwards. - Named materials do not survive: the result carries one baked texture atlas, not the separate material slots create_model returned. Parts kept by preserve_parts can still be tinted individually. A reference image drives the look. Give a prompt describing the desired appearance and one is generated for you, or reuse an existing one with reference_image_id. Cost detail: given only a prompt, a reference image is generated for the job and billed separately (about 7 cubes), so the call totals roughly 47. Supplying the image yourself, or reusing one with reference_image_id, skips that generation and costs 40.
thrixel_download
ChatGPTGet a download link for a finished model in a specific format. The server converts the model first when that format has not been made yet. Every format is available on every plan at no extra cost. GLB is the right choice for web and Three.js and is served directly; FBX, OBJ, STL and USDZ are converted on demand, so the first request for one takes longer. BUILDING A THREE.JS OR BROWSER GAME: pass textures='webp'. Same model - same parts, same triangle count, same bounds - with WebP textures instead of PNG. Measured: a texture-heavy model goes 18.3MB -> 0.95MB, a geometry-heavy one 7.0MB -> 6.3MB. Browsers decode WebP natively, so there is nothing to install and nothing to wire up. Use it for every asset headed to a web page. draco=True additionally compresses the GEOMETRY, which only pays off on models that are mostly geometry (6.3MB -> 1.2MB on the example above; about 4% on a texture-heavy one). It needs a Draco decoder on the other end: three.js requires DRACOLoader to be set up explicitly. A reader WITHOUT one does not error, it loads every vertex at the origin, so the failure surfaces later as an empty scene. Leave it off unless you know the consumer decodes Draco, and never use it for a model going into Unity, Unreal, a modelling tool, or back into another pipeline.
thrixel_edit_model
ChatGPTChange an existing model with a natural-language instruction, keeping everything you did not ask to change. Use this to iterate rather than regenerating from scratch: it is faster, it preserves the parts of the asset that were already correct, and it is normally much CHEAPER than making the model again - a measured edit that deleted two parts, added four new ones and restyled the body still cost well under half a regenerate. That is the workflow to plan around: iterate hard and cheaply here while the model is still a blockout, then run thrixel_detail_model ONCE at the end. Detailing is terminal, so an edit is only possible before it. Works on Architect, Auto-fix and Edit results, and NOT on a detailed one - that is refused outright. Say what the result should BE ('the roof is corrugated metal, rusted at the edges'), not just what to do ('make it rusty'). To change only some parts, pass their exact node names in focus_on_node_names - get those from thrixel_inspect_model. Naming new parts in the instruction works too: they come back under the names you used. Bounds note: an edit can move the model's origin, because the origin is derived from the model's lowest geometry. Deleting or adding something at the bottom shifts the whole asset relative to it. Re-check any offset you computed against the previous version. Cost is metered: charged after the run based on actual model usage, so it scales with how complex the request is. Typically tens of cubes, and a complex one can exceed the 40 a GPU operation costs. It is not free. What it meters is LANGUAGE MODEL usage - how much work it took to write the script - NOT the part count or the triangle count of what comes out. That is why a 12-part object can cost more than a 65-part one: its shapes were harder to describe in code, not bigger. Without this the numbers look arbitrary and a careful caller stops trusting the estimate.
thrixel_generate_image
ChatGPTGenerate one or more 2D images from a text description: concept art, a character line-up, a colour study, a mood board, a reference sheet. Costs about 7 cubes per image, charged after it is generated. That is the same price a detail / sculpt / texture call pays to generate its own reference image, so making one here first costs nothing extra - and reusing its id with reference_image_id then makes those calls cheaper. USE THIS BEFORE COMMITTING TO GEOMETRY. Settling a look costs a few cubes an image here against 40 or more per 3D generation, so agree the 2D first and only then build the mesh. That is the normal way to direct art and it is much the cheaper order. The result carries an image_id. Pass that id as reference_image_id to thrixel_sculpt_model, thrixel_create_model, thrixel_detail_model or thrixel_retexture_model and the job runs against this exact image: no second charge for a generated reference, and every asset driven by the same image reads as one set. Images are saved to the account's Image Hub and visible in the web app. Waits for generation and returns the pictures, so look at them before building anything.
thrixel_group_parts
ChatGPTJoin a model's many separate mesh nodes into the few an engine actually needs to move independently. FREE. RUN THIS BEFORE IMPORTING A MULTI-PART MODEL INTO A GAME. Models from thrixel_create_model come back as 99 to 342 separate mesh nodes, because each named part is its own node. Every engine gives each node its own object and its own draw call, so a dozen unmodified models is thousands of draw calls before any scenery exists and the frame rate collapses. This welds everything that does not move into one mesh. DOES NOT APPLY to a model that is already a single mesh - there is nothing to weld together, and submitting one is rejected. thrixel_sculpt_model and thrixel_detail_model both return exactly one mesh, so skip this step for their output and import it directly. To fit such a model to a triangle budget use thrixel_reduce_triangles, which is the tool for that on any model. thrixel_inspect_model lists the nodes if you are unsure. Name the parts that must still move in keep_groups: wheels, sails, turrets, doors, propellers. Each becomes its own mesh with its origin at its own geometric centre, so the engine can rotate it in place instead of orbiting the model root. The result reports each group's origin, which is what you position and animate against. Call thrixel_inspect_model first and use the part names it lists, verbatim. Do NOT invent names from convention (ArmL, Head_Group, Leg_FL): every model names its parts differently, and guessed names are the single most common reason this operation fails. Names are validated against the model's real node list when you submit, so a bad name fails instantly and the error lists the real names with per-group suggestions: correct from THAT list, do not guess again. Near-miss spellings of real names do match (word order and L/R/front/back abbreviations are understood), but only inspection guarantees the parts you care about exist at all. A group that matches nothing FAILS the job on purpose: silently welding a moving part into the body gives you a model that looks perfect and simply never animates. Material slots survive the join as submeshes, so per-surface names (Paint, Glass, Chrome, Rubber) stay addressable afterwards. Measured on a real 15-asset project, nodes before -> after: windmill 48 -> 2, bakery 30 -> 1, keep 60+ -> 3, catapult 60 -> 6, swordsman 28 -> 8. That is 10-40x fewer draw calls, for free. Pivot origins and sizes in the result are Y-up, matching the exported GLB, so a pivot is usable as an engine position with no axis conversion. Every Thrixel GLB is Y-up; never detect it per asset.
thrixel_inspect_model
ChatGPTShow what a model actually contains: its part names, per-part triangle counts, world bounds, and a rendered thumbnail. Call this before any operation that targets specific parts - thrixel_edit_model, thrixel_retexture_model and thrixel_reduce_triangles all take exact node names, and guessing them fails. Also use it to check a triangle budget before shipping an asset. Long models are paged rather than silently cut: if the scene graph does not fit, the listing switches to heaviest-first so what falls off the end is the least significant, and says how many were omitted. Use offset to page through the rest. Reports the exported up-axis, which is always y. If a pivot listing elsewhere looks Z-up, that is Thrixel's internal working space, not the file.
thrixel_job_status
ChatGPTCheck whether a job has finished, and how long it has been running. Only needed for jobs submitted with wait=false - every other tool already waits and returns the finished asset. A job can sit at queued for a long time while your own concurrency cap still reports free slots: detail, sculpt, texture and rebake all share one GPU lane across the whole service, so your slots say nothing about how many jobs are ahead of yours. Waiting is normal. Resubmitting is not - it pays twice for the same asset.
thrixel_list_assets
ChatGPTList models already in this Thrixel account, newest first. Use it to find and reuse an existing asset instead of generating a duplicate, or to recover a submission_id from an earlier session. Each row is: submission_id, what made it, status, date, name. A derived asset (a detail pass, an edit, a triangle reduction) also names the model it came from, so a chain can be walked back to its blockout. Names are short by design. Pass verbose=true to also print each asset's full prompt, which is far larger and rarely what you need.
thrixel_list_games
ChatGPTList this account's games on thrixel.world with their URLs, status and game_id. Use the game_id with thrixel_publish_game to update a game in place, or with thrixel_unpublish_game to take it offline.
thrixel_list_images
ChatGPTList the 2D images in this account's Image Hub, newest first, with the id needed to reuse one. Free. Use it to find an image generated earlier - by thrixel_generate_image, by the web app, or automatically as the reference behind a previous detail, sculpt or texture job - and reuse it instead of paying to generate another. Reusing one image across a set is also what keeps the set visually consistent. Pass show_usage to see which models each image has already driven.
thrixel_list_project_sources
ChatGPTList the text files attached to the active project, with how much of the 256 KB budget is used. Free. Use it to check what rules are already in force before adding more, and to confirm a file is actually being applied.
thrixel_list_projects
ChatGPTList the projects on this account, newest first, with how many assets each holds. Free. Use it to find the project_id for a game the user started earlier, then pass that id to thrixel_start_project to resume it.
thrixel_move_asset
ChatGPTRefile an existing model under a different project. Free, and nothing about the model changes. Use it when assets landed in the wrong place - generated before thrixel_start_project was called, or filed under the project that happened to be active rather than the one they belong to. Omit project_id to move it into the project this session is working in. Both the asset and the destination project must belong to this account.
thrixel_publish_game
ChatGPTDeploy a game as a playable web page on thrixel.world. Free, no cubes. This connector runs on Thrixel's servers, so pass the game as data: files holds every file except the 3D models (paths relative to the game root, index.html required), and assets names the Thrixel models the game loads by path, which are fetched and packed in for you. The result gives the game's public https://<slug>.thrixel.world URL, which is the link to hand the user. Pass game_id to update an existing game at the same URL. Only static files ship; server-side components will not run. The bundle is scanned for API keys first and refused if it has one.
thrixel_reduce_triangles
ChatGPTCut a model down to a triangle budget. FREE and fast - always use this to lighten an asset instead of re-running thrixel_detail_model at a lower target, which costs cubes, takes minutes, and gives you a different model rather than a lighter version of the same one. Keeps the existing texture. Works on any completed model: detailed and sculpted models are rebuilt with cleaner topology, other models are decimated in place. The right endpoint is chosen for you. How low you can go depends on the model, not on a fixed number. A dense single-piece mesh from detail or sculpt (often 100k+ triangles) reduces enormously - hero prop 20k-50k, background prop 2k-10k. A multi-part model from create_model is different: it is already light, and each part needs a handful of triangles to stay a solid shape, so its floor is roughly the part count times ten. Check the current count with thrixel_inspect_model first. Targets below the floor are clamped and the result says so, rather than shredding the parts to hit a number.
thrixel_rename_asset
ChatGPTGive an existing model a short, human name. Free. Use it when a listing is unreadable: an asset generated from a long prompt is labelled with that prompt, and a derived one (a detail pass, a triangle reduction) inherits whatever its parent had. A one or two word name is what makes thrixel_list_assets scannable in a later session. The name is a label only. Nothing about the model changes, and every submission_id stays valid.
thrixel_retexture_model
ChatGPTGenerate fresh textures for a model without touching its geometry. Costs 40 cubes. USE THIS, NOT thrixel_detail_model, WHENEVER THE SHAPE IS ALREADY RIGHT. Geometry is untouched here, so every part, every name and every proportion survives exactly. That guarantee is the reason to pick it: detailing rebuilds the mesh and can lose thin parts, round off precise shapes and collapse named materials. This is the right call for precision hard-surface work and for buildings. This is the cheap way to restyle: to make a whole set of assets cyberpunk, retexture each one against the same reference image rather than regenerating them. Pass the same reference_image_id every time to keep the set consistent AND to avoid paying for a new reference image on every asset. Cost detail: given only a prompt, a reference image is generated for the job and billed separately (about 7 cubes), so the call totals roughly 47. Supplying the image yourself, or reusing one with reference_image_id, skips that generation and costs 40. Works on any completed model, not just detailed ones. To restyle only some parts, name them in apply_to_node_names.
thrixel_sculpt_model
ChatGPTCreate a dense, organic 3D model from a text description and/or a single reference image. Costs 40 cubes. Cost detail: given only a prompt, a reference image is generated for the job and billed separately (about 7 cubes), so the call totals roughly 47. Supplying the image yourself, or reusing one with reference_image_id, skips that generation and costs 40. Use this for creatures, characters, plants, rocks, food, cloth - anything sculpted rather than assembled - and whenever you are starting from a photo. The output is ONE high-density textured mesh with NO separate parts, and that is permanent: nothing on it can be animated or moved independently later. So if any piece of the asset has to move on its own, use thrixel_create_model instead, even for an organic subject. For a STATIC organic asset this beats thrixel_create_model followed by thrixel_detail_model on both looks and price: that chain is metered Architect cost and then a flat 40, roughly 1.5x this tool. To make a whole set share one look, pass the same style_reference_submission_id to every call - a finished model carries a palette and a finish far better than repeating adjectives does. For rules rather than looks (polycount, naming, sizes), use thrixel_add_project_source instead; the two combine. Waits for the job to finish, saves the GLB, and returns the file path plus a rendered thumbnail.
thrixel_start_project
ChatGPTCreate a Thrixel project and make it the destination for everything generated afterwards, or reopen an existing one. Free. CALL THIS FIRST, before generating anything, and name it after the game. Every model, edit, detail pass and texture pass from then on is filed under it automatically - you do not pass project_id anywhere. Without it, assets from every game the user has ever built land in one flat list, and there is no way to sort them out afterwards. Pass name to create a new project. Pass project_id instead to resume one that already exists - use thrixel_list_projects to find it. Resuming is the right move when the user returns to a game they started earlier, so the new assets join the old ones. Pass BOTH project_id and name to RENAME a project and resume it in the same call. Games get renamed mid-development; do this rather than creating a second project, which would split one game's assets across two folders. Only the label changes - every asset stays where it is. The project is visible in the Thrixel web app, so the user can browse and edit that game's assets as a set.
thrixel_unpublish_game
ChatGPTTake a game off thrixel.world immediately. The address stays reserved for this account, and republishing with the same game_id revives it at the same URL. To hide a game from the public directory while KEEPING the link playable, use thrixel_update_game with listed=false instead.
thrixel_update_game
ChatGPTUpdate a published game's title, or ask for it to be listed in the public thrixel.world directory. A game is playable at its URL from the moment it is published; listing is a separate request that Thrixel staff review, so listed=true leaves it 'pending' rather than immediately public. listed=false withdraws the request, or takes an already-listed game back out. Neither affects the URL.