Skip to content

3D model generation

The polyGen step turns a text prompt or a reference image into a downloadable 3D model. Three engines are available, picked with the engine + model discriminator pair:

engine / modelBest forNotes
comfy / hunyuan3DImage → 3D on Civitai's own workersTencent Hunyuan3D (open model, v2 / v2.1 / v2-mini). imageTo3D plus a shapeGentexGen split. Lowest Buzz cost and the most knobs (steps, cfg, sampler, octree). Image-only; no rigging.
fal / meshyText-to-3D, rigging & animationMeshy v6, FAL-hosted. textTo3D and imageTo3D. GLB + FBX + preview thumbnail, optionally a rigged, animation-ready character with walk/run clips. The only text-capable engine.
fal / tripoFast hosted image → 3D with fine texture controlTripo v2.5, FAL-hosted. imageTo3D only. GLB (or FBX with quad) + preview image. HD/PBR texturing and quad topology.

Default choice for new integrations: for image-to-3D, lead with engine: "comfy", model: "hunyuan3D" — it runs on Civitai's own Comfy workers, costs the least, and exposes the most control. Reach for model: "meshy" when you need a text prompt, rigging, or animation (its only home), and model: "tripo" for fast hosted image-to-3D with quad topology or HD/PBR textures.

Every generation returns a GLB in the step's output.model. 3D generation runs for minutes, not seconds — always submit with wait=0 and either poll GetWorkflow or register a webhook (see Results & webhooks).

Prerequisites

  • A Civitai orchestration token (Quick start → Prerequisites)
  • For any imageTo3D call: a publicly reachable source image URL (a Civitai CDN URL or your own hosted image)

Meshy — text-to-3D

Meshy's text path generates geometry and textures from a prompt alone. mode: "preview" returns untextured geometry fast for iteration; mode: "full" (default) adds textures.

http
POST https://orchestration.civitai.com/v2/consumer/workflows?wait=0
Authorization: Bearer <your-token>
Content-Type: application/json

{
  "steps": [{
    "$type": "polyGen",
    "input": {
      "engine": "fal",
      "model": "meshy",
      "operation": "textTo3D",
      "prompt": "a low-poly viking helmet with engraved runes",
      "mode": "full",
      "topology": "triangle",
      "targetPolycount": 30000
    }
  }]
}
POST/v2/consumer/workflows
Set your Civitai API token via the Token button in the navbar to enable Try It.
Request body — edit to customize (e.g. swap the image URL or prompt)
Valid JSON

Meshy — image-to-3D

Reconstruct a model from a single reference image. Set shouldTexture: false for a bare mesh.

http
POST https://orchestration.civitai.com/v2/consumer/workflows?wait=0
Authorization: Bearer <your-token>
Content-Type: application/json

{
  "steps": [{
    "$type": "polyGen",
    "input": {
      "engine": "fal",
      "model": "meshy",
      "operation": "imageTo3D",
      "imageUrl": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dd4b4ad5-040f-4f0e-baa3-6e1ff00add65/original=true,quality=90,optimized=true/26781018.jpeg",
      "shouldTexture": true,
      "topology": "quad",
      "targetPolycount": 50000,
      "enablePbr": true
    }
  }]
}
POST/v2/consumer/workflows
Set your Civitai API token via the Token button in the navbar to enable Try It.
Request body — edit to customize (e.g. swap the image URL or prompt)
Valid JSON

Rigging & animation (Meshy only)

Set enableRigging: true to get an armature-bound character plus basic walk/run clips; add enableAnimation: true for a full animated take. These populate the extra output blobs described in Reading the result. Works best on a full-body humanoid subject in an A-pose.

http
POST https://orchestration.civitai.com/v2/consumer/workflows?wait=0
Authorization: Bearer <your-token>
Content-Type: application/json

{
  "steps": [{
    "$type": "polyGen",
    "input": {
      "engine": "fal",
      "model": "meshy",
      "operation": "textTo3D",
      "prompt": "a friendly cartoon wizard in robes, full body, A-pose",
      "mode": "full",
      "topology": "quad",
      "targetPolycount": 60000,
      "enablePbr": true,
      "enableRigging": true
    }
  }]
}
POST/v2/consumer/workflows
Set your Civitai API token via the Token button in the navbar to enable Try It.
Request body — edit to customize (e.g. swap the image URL or prompt)
Valid JSON

Meshy parameters

FieldRequiredDefaultNotes
operationtextTo3D or imageTo3D.
prompttextTo3D onlyMax 600 chars.
imageUrlimageTo3D onlyPublic source image URL.
modefulltextTo3D only. preview = untextured geometry (fast), full = textured.
enablePromptExpansionfalsetextTo3D only. Expands the prompt with an LLM before generation.
shouldTexturetrueimageTo3D only. false returns a bare mesh.
topologytriangletriangle or quad.
targetPolycount30000Range 100300000.
symmetryModeautooff, auto, or on.
shouldRemeshtrueRemesh to the target topology/polycount.
enablePbrfalseGenerate PBR (metallic/roughness) texture maps.
texturePromptOptional text guidance for texturing (max 600 chars).
enableRiggingfalseProduce a rigged character + basic walk/run animations.
enableAnimationfalseProduce an animated GLB/FBX.
seedrandomReproducibility. Assigned automatically when omitted.

Tripo — image-to-3D

Rolling out

Tripo v2.5 is newly added. The interactive runner below works once it's live in production; until then it returns a 400 for discriminator value tripo.

Tripo reconstructs a model from a single image with fine control over texturing. texture picks the fidelity (no/standard/HD); pbr adds PBR maps; quad switches the mesh to quad topology (and produces FBX instead of GLB).

http
POST https://orchestration.civitai.com/v2/consumer/workflows?wait=0
Authorization: Bearer <your-token>
Content-Type: application/json

{
  "steps": [{
    "$type": "polyGen",
    "input": {
      "engine": "fal",
      "model": "tripo",
      "imageUrl": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dd4b4ad5-040f-4f0e-baa3-6e1ff00add65/original=true,quality=90,optimized=true/26781018.jpeg",
      "texture": "HD",
      "pbr": true,
      "orientation": "align_image"
    }
  }]
}
POST/v2/consumer/workflows
Set your Civitai API token via the Token button in the navbar to enable Try It.
Request body — edit to customize (e.g. swap the image URL or prompt)
Valid JSON

Quad topology yields cleaner edge loops for downstream editing. Because Tripo emits FBX (not GLB) in quad mode, read the result from output.fbxModel rather than output.model:

http
POST https://orchestration.civitai.com/v2/consumer/workflows?wait=0
Authorization: Bearer <your-token>
Content-Type: application/json

{
  "steps": [{
    "$type": "polyGen",
    "input": {
      "engine": "fal",
      "model": "tripo",
      "imageUrl": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dd4b4ad5-040f-4f0e-baa3-6e1ff00add65/original=true,quality=90,optimized=true/26781018.jpeg",
      "texture": "standard",
      "quad": true,
      "autoSize": true
    }
  }]
}
POST/v2/consumer/workflows
Set your Civitai API token via the Token button in the navbar to enable Try It.
Request body — edit to customize (e.g. swap the image URL or prompt)
Valid JSON

Tripo parameters

FieldRequiredDefaultNotes
imageUrlPublic source image URL.
texturestandardno (mesh only), standard, or HD.
pbrfalseGenerate PBR maps. Implies a textured result even when texture: "no".
faceLimitadaptiveCap the output face count. Range 1000500000.
autoSizefalseScale the model to real-world dimensions (metres).
quadfalseQuad topology. Produces an FBX mesh instead of GLB (read output.fbxModel).
textureAlignmentoriginal_imageoriginal_image or geometry.
orientationdefaultalign_image auto-rotates the model to match the input image.
seedrandomGeometry reproducibility. Assigned automatically when omitted.
textureSeedrandomTexture reproducibility.

Hunyuan3D — image-to-3D

Tencent's open Hunyuan3D running on Civitai's own Comfy workers — the cheapest 3D path and the one with the most control. Image-only. The default imageTo3D operation generates the mesh and (when shouldTexture is true) textures it in one submission. Pick fidelity with modelVersion:

modelVersionNotes
v2Default. Fast — 5 steps, 3072 shape resolution.
v2.1Highest quality — 30 steps, 4096 shape resolution.
v2-miniSmallest/fastest variant, same defaults as v2.
http
POST https://orchestration.civitai.com/v2/consumer/workflows?wait=0
Authorization: Bearer <your-token>
Content-Type: application/json

{
  "steps": [{
    "$type": "polyGen",
    "input": {
      "engine": "comfy",
      "model": "hunyuan3D",
      "operation": "imageTo3D",
      "modelVersion": "v2.1",
      "imageUrl": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dd4b4ad5-040f-4f0e-baa3-6e1ff00add65/original=true,quality=90,optimized=true/26781018.jpeg",
      "shouldTexture": true,
      "octreeResolution": 256
    }
  }]
}
POST/v2/consumer/workflows
Set your Civitai API token via the Token button in the navbar to enable Try It.
Request body — edit to customize (e.g. swap the image URL or prompt)
Valid JSON

v2-mini is the quickest way to preview a mesh:

POST/v2/consumer/workflows
Set your Civitai API token via the Token button in the navbar to enable Try It.
Request body — edit to customize (e.g. swap the image URL or prompt)
Valid JSON

Split shapeGen / texGen (advanced)

The imageTo3D operation runs shape then texture internally. To cache or reuse an untextured mesh — or to re-texture one mesh several times — run the two operations as separate steps and reference the shape output from the texture step. mesh takes a step $ref to the shape step's GLB:

http
POST https://orchestration.civitai.com/v2/consumer/workflows?wait=0
Authorization: Bearer <your-token>
Content-Type: application/json

{
  "steps": [
    {
      "$type": "polyGen",
      "name": "shape",
      "input": {
        "engine": "comfy",
        "model": "hunyuan3D",
        "operation": "shapeGen",
        "modelVersion": "v2.1",
        "imageUrl": "https://.../reference.jpg"
      }
    },
    {
      "$type": "polyGen",
      "name": "texture",
      "input": {
        "engine": "comfy",
        "model": "hunyuan3D",
        "operation": "texGen",
        "modelVersion": "v2.1",
        "imageUrl": "https://.../reference.jpg",
        "mesh": { "$ref": "shape", "path": "output.model.url" },
        "enablePbr": true
      }
    }
  ]
}

Hunyuan3D parameters

FieldRequiredDefaultNotes
operationimageTo3DimageTo3D (mesh + texture), shapeGen (mesh only), or texGen (texture an existing mesh).
modelVersionv2v2, v2.1, or v2-mini.
imageUrlPublic source image URL.
promptOptional guidance for imageTo3D/shapeGen (max 600 chars).
meshtexGen onlyAIR or step $ref to the mesh to texture.
shouldTexturetrueimageTo3D only. false returns a bare mesh (and bills as shape-only).
shouldRemeshfalseimageTo3D/texGen. Remesh before texturing.
enablePbrtrueimageTo3D/texGen. Generate PBR maps.
steps5 (v2/v2-mini), 30 (v2.1)Range 1150. Scales cost linearly (see below).
cfgScale5 (v2/v2-mini), 7.5 (v2.1)Range 030.
octreeResolution256Range 16512. Higher = finer mesh; scales cost linearly.
resolution3072 (v2/v2-mini), 4096 (v2.1)Shape resolution. Range 18192.
samplereulerComfyUI sampler (e.g. dpmpp_2m, uni_pc).
schedulernormalnormal, karras, exponential, sgm_uniform, simple, ddim_uniform, beta.
vaeNumChunks8000Range 1000500000. VAE decode chunking.
meshThreshold0.6Range 01. Surface extraction threshold.
shift1Timestep shift.
modelAirversion defaultOverride the model checkpoint AIR (urn:air:hy3d:repository:huggingface:...).
seedrandomAssigned automatically when omitted.

Reading the result

A succeeded polyGen step carries the model blobs in output. The required model is always a GLB; the other blobs appear only when the engine produced them (FBX, thumbnail, and Meshy's rigging/animation outputs).

json
{
  "status": "succeeded",
  "steps": [{
    "name": "0",
    "$type": "polyGen",
    "status": "succeeded",
    "output": {
      "model":     { "id": "blob_abc.glb", "available": true, "url": "https://.../signed.glb", "format": "glb" },
      "fbxModel":  { "id": "blob_abc.fbx", "available": true, "url": "https://.../signed.fbx", "format": "fbx" },
      "thumbnail": { "id": "blob_abc-thumbnail.png", "available": true, "url": "https://.../signed.png" }
    }
  }]
}

Fields:

  • model — the generated model in GLB format (always present). For Tripo quad runs the GLB is empty (available: false) and the mesh lands in fbxModel instead.
  • fbxModel — FBX export, when the engine produced one.
  • thumbnail — preview image of the model, when available.
  • riggedModel / riggedFbxModel — Meshy rigging output (enableRigging: true).
  • animatedModel / animatedFbxModel — Meshy animation output (enableAnimation: true).
  • basicAnimations — Meshy walk/run clips (walkingModel, runningModel, …) bundled when rigging is enabled.

Hunyuan3D populates model only (the textured GLB) — no FBX or thumbnail.

Blob URLs are signed and expire — refetch the workflow or call GetBlob for a fresh URL.

Runtime

3D generation is minutes-scale, so a single long-poll won't cover it — submit with wait=0 and poll GetWorkflow (or use a webhook). Meshy holds its worker claim for up to 20 minutes; textured and rigged runs sit at the higher end of that. Tripo is typically faster, but as a fresh release treat its timings as preliminary until fleet capacity settles. Hunyuan3D is compute-intensive and depends on Comfy GPU worker availability — it can queue before it runs, and v2.1 at high octreeResolution/steps is the slowest path; v2 and v2-mini are the quickest.

Cost

Billed in Buzz on the workflow's transactions. Use whatif=true for an exact preview; see Payments (Buzz) for currency selection.

Meshy is a flat rate — rigging, animation, PBR, topology, and polycount don't change the price:

ShapeBuzz
Any Meshy textTo3D or imageTo3D run1040

Tripo is driven by texture fidelity plus the quad surcharge:

buzz = (textureDollars + (quad ? 0.05 : 0)) × 1000 × 1.3
textureDollars = 0.2 (no) | 0.3 (standard, or "no" with pbr) | 0.4 (HD)
ShapeBuzz
texture: "standard" (default)390
texture: "no" (mesh only)260
texture: "HD"520
+ quad (any texture)+65
texture: "HD" + quad585

faceLimit, autoSize, orientation, textureAlignment, and both seeds don't affect Tripo's price.

Hunyuan3D bills a base shape charge scaled by mesh resolution and step count, plus a flat texturing charge when a texture is produced:

shape  = 60 × (octreeResolution / 256) × (steps / defaultSteps)
texGen = 100  (added when texturing; the whole cost for the texGen operation)
defaultSteps = 30 (v2.1), 5 (v2 / v2-mini)
ShapeBuzz
imageTo3D, textured, defaults160
imageTo3D, shouldTexture: false (mesh only)60
shapeGen only60
texGen only100
imageTo3D textured, octreeResolution: 512220

modelVersion shifts the step baseline but not the price at defaults (each version's default steps normalises the steps factor to 1). Doubling octreeResolution or steps doubles the shape charge; the texGen charge is flat.

Troubleshooting

SymptomLikely causeFix
400 — "No derived type found for discriminator value 'tripo'"Tripo isn't live in your target environment yetUse model: "meshy", or wait for the Tripo rollout.
400 — "Prompt is required" / "ImageUrl is required"operation/model doesn't match the field you senttextTo3D needs prompt; every imageTo3D and all Tripo calls need imageUrl.
output.model.available is falseTripo quad run (mesh went to FBX), or the source image was rejectedRead output.fbxModel for quad runs; otherwise check the source image is reachable.
Hunyuan3D step sits unassigned / queuedNo free Comfy worker holds the modelWait for capacity, or fall back to hosted model: "meshy" / "tripo".
Request timed out (wait expired)3D generation exceeds the long-poll windowSubmit with wait=0 and poll, or register a webhook.
Step failed, reason = "blocked"Content moderationDon't retry the same input — see Errors & retries → Step-level failures.

Civitai Developer Documentation