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, FAL-hosted, in two versions picked with version. v6 (default) does textTo3D and imageTo3D; v7 does imageTo3D and multiImageTo3D with an ultraMode fidelity tier, but has no text path. 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 v7 — image-to-3D

Meshy v7 is a newer generation of the same model. Opt in with version: "v7"; omit version and you stay on v6. It takes everything v6's imageTo3D takes, plus ultraMode for higher-fidelity geometry and modelType: "lowpoly" for a cleaner low-poly mesh. It has no text-to-3D pathtextTo3D stays on v6.

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",
      "version": "v7",
      "operation": "imageTo3D",
      "imageUrl": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dd4b4ad5-040f-4f0e-baa3-6e1ff00add65/original=true,quality=90,optimized=true/26781018.jpeg",
      "ultraMode": 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

Unlike v6, v7 prices per feature — a bare mesh is cheaper than a textured one, and ultraMode, rigging and animation each add to the bill. See Cost.

Meshy v7 — multi-image-to-3D

Give v7 up to four views of the same object and it reconstructs from all of them, which resolves geometry a single view can't. ultraMode and modelType aren't available on this operation; everything else matches imageTo3D.

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",
      "version": "v7",
      "operation": "multiImageTo3D",
      "imageUrls": [
        "https://example.com/front.png",
        "https://example.com/side.png",
        "https://example.com/back.png"
      ],
      "topology": "quad",
      "targetPolycount": 50000
    }
  }]
}
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

Shared by both versions unless noted:

FieldRequiredDefaultNotes
versionv6v6 or v7. Omit to stay on v6.
operationv6: textTo3D or imageTo3D. v7: imageTo3D or multiImageTo3D.
prompttextTo3D onlyMax 600 chars.
imageUrlimageTo3D onlyPublic source image URL.
modefullv6 textTo3D only. preview = untextured geometry (fast), full = textured.
enablePromptExpansionfalsev6 textTo3D only. Expands the prompt with an LLM before generation.
shouldTexturetrueNot on v6 textTo3D. 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. Requires enableRigging.
seedrandomv6 only. Reproducibility. Assigned automatically when omitted.

v7 adds:

FieldRequiredDefaultNotes
imageUrlsmultiImageTo3D only1–4 public URLs, all showing the same object from different angles.
ultraModefalseimageTo3D only. Higher-fidelity geometry with finer surface detail.
modelTypestandardimageTo3D only. lowpoly produces cleaner low-poly geometry and makes Meshy ignore topology, targetPolycount and shouldRemesh.
poseModenonenone, a-pose, or t-pose.
textureImageUrlReference image guiding the texturing pass.
riggingHeightMeters1.7Approximate character height. Only used with enableRigging.
animationActionId92Meshy animation preset, 0696 (0 is "Idle"). Only used with enableAnimation. See Meshy's animation library.

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 v6 is a flat rate — rigging, animation, PBR, topology, and polycount don't change the price:

ShapeBuzz
Any v6 textTo3D or imageTo3D run1040

Meshy v7 prices per feature instead. Start from the base mesh and add each option you enable:

buzz = 1040                          base mesh
     + 520   if shouldTexture        (default on)
     + 260   if ultraMode            (imageTo3D only)
     + 260   if enableRigging
     + 156   if enableAnimation
ShapeBuzz
shouldTexture: false (bare mesh)1040
textured (default)1560
textured + ultraMode1820
textured + rigged1820
textured + ultraMode + rigged + animated2236

multiImageTo3D uses the same schedule minus ultraMode, and the number of input images doesn't change the price. topology, targetPolycount, symmetryMode, enablePbr, poseMode and modelType are all free.

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.
400 — "No derived type found for discriminator value 'textTo3D'"version: "v7" with a text promptv7 has no text path. Drop version to use v6, or switch to imageTo3D.
400 — "enableAnimation requires enableRigging"v7 animation without an armatureSet enableRigging: true as well; Meshy animates the rigged character.
400 — "multiImageTo3D requires between one and four source images"imageUrls empty or longer than 4Send 1–4 views of the same object.
v7 lowpoly ignores your polycountmodelType: "lowpoly" overrides the remesh controlsExpected — use modelType: "standard" if you need targetPolycount/topology honoured.
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