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 shapeGen → texGen split. Lowest Buzz cost and the most knobs (steps, cfg, sampler, octree). Image-only; no rigging.
fal / meshyText-to-3D, rigging & animationMeshy, FAL-hosted, with version selecting the model. v6 (default) does textTo3D and imageTo3D; v7 does image and multi-image generation; v7.1 supports all three, with Smart Topology and geometry resolution controls. 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 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 ​

  • 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. Our v7 integration exposes image operations. Use v7.1 for the newer text, image and multi-image paths; FAL marks v7 deprecated.

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 v7.1 ​

Select engine: "fal", model: "meshy" and version: "v7.1". The three operations use the existing polyGen output, including optional rigged and animated models.

Text to 3D ​

json
{
  "steps": [
    {
      "$type": "polyGen",
      "input": {
        "engine": "fal",
        "model": "meshy",
        "version": "v7.1",
        "operation": "textTo3D",
        "prompt": "A friendly cartoon astronaut, full body, wearing a white suit with orange accents.",
        "mode": "full",
        "geometryResolution": "4k",
        "seed": 12345
      }
    }
  ]
}
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

Image to 3D ​

json
{
  "steps": [
    {
      "$type": "polyGen",
      "input": {
        "engine": "fal",
        "model": "meshy",
        "version": "v7.1",
        "operation": "imageTo3D",
        "imageUrl": "https://v3b.fal.media/files/b/zebra/3osHJDI8IZ2wl6sGtEUeB_image.png",
        "modelType": "smart-topology",
        "targetPolycount": 4000,
        "shouldTexture": true,
        "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

Multi-image to 3D ​

json
{
  "steps": [
    {
      "$type": "polyGen",
      "input": {
        "engine": "fal",
        "model": "meshy",
        "version": "v7.1",
        "operation": "multiImageTo3D",
        "imageUrls": [
          "https://v3b.fal.media/files/b/kangaroo/cPyD3-por0XI7jDa9F9vP_image%20(3).png",
          "https://v3b.fal.media/files/b/elephant/9sd5JWAOJBcR7G3NMjPVs_image%20(2).png",
          "https://v3b.fal.media/files/b/tiger/TP4sTzPATX_w1Tn4m6kYM_image%20(1).png"
        ],
        "geometryResolution": "2k",
        "shouldTexture": 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

v7.1 controls ​

  • Text generation uses mode: "preview" for bare geometry or "full" (default) for textures. prompt is required, up to 600 characters. seed is optional, from 0 to 2,147,483,647; zero is valid and omission assigns a random seed.
  • Image operations use shouldTexture (default true). enablePbr: true requires textures.
  • geometryResolution accepts standard (default), 2k, or 4k for text and single-image generation. The 2k/4k options require modelType: "standard"; Smart Topology uses standard resolution. Multi-image accepts only standard or 2k.
  • Text and single-image generation support modelType: "standard" and "smart-topology". Smart Topology defaults to 4,000 polygons and accepts at most 15,000. Standard mode defaults to 30,000. FAL advertises lowpoly, but its v7.1 text and image endpoints reject it; that option is currently unavailable through orchestration.
  • Multi-image requires 1–4 imageUrls showing the same object from different angles. It has no modelType or seed input.
  • poseMode, textureImageUrl, riggingHeightMeters and animationActionId work as described below. enableAnimation requires enableRigging.
  • Use geometryResolution for v7.1; the legacy ultraMode field is rejected.

Meshy parameters ​

Shared across versions unless noted:

FieldRequiredDefaultNotes
versionv6v6, v7, or v7.1. Omit to stay on v6.
operation✅—v6: textTo3D or imageTo3D. v7: imageTo3D or multiImageTo3D. v7.1: all three.
prompttextTo3D only—Max 600 chars.
imageUrlimageTo3D only—Public source image URL.
modefullv6/v7.1 textTo3D only. preview = untextured geometry (fast), full = textured.
enablePromptExpansionfalsev6/v7.1 textTo3D only. Expands the prompt with an LLM before generation.
shouldTexturetrueImage operations only. false returns a bare mesh.
topologytriangletriangle or quad.
targetPolycount30000Range 100–300000; v7.1 Smart Topology defaults to 4,000 and caps at 15,000.
symmetryModeautooff, auto, or on.
shouldRemeshtrueRemesh to the target topology/polycount.
enablePbrfalseGenerate PBR (metallic/roughness) texture maps.
texturePrompt—Optional text guidance for texturing (max 600 chars).
enableRiggingfalseProduce a rigged character + basic walk/run animations.
enableAnimationfalseProduce an animated GLB/FBX. Requires enableRigging.
seedrandomv6, and v7.1 text generation. Assigned automatically when omitted.

v7/v7.1 add (differences noted):

FieldRequiredDefaultNotes
imageUrlsmultiImageTo3D only—1–4 public URLs, all showing the same object from different angles.
ultraModefalsev7 imageTo3D only. Higher-fidelity geometry with finer surface detail.
modelTypestandardv7 image: standard or lowpoly; v7.1 text/image: standard or smart-topology. v7 lowpoly makes Meshy ignore topology, targetPolycount and shouldRemesh.
poseModenonenone, a-pose, or t-pose.
textureImageUrl—Reference image guiding the texturing pass.
riggingHeightMeters1.7Approximate character height. Only used with enableRigging.
animationActionId92Meshy animation preset, 0–696 (0 is "Idle"). Only used with enableAnimation. See Meshy's animation library.

Tripo — image-to-3D ​

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
imageUrl✅—Public 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 1000–500000.
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.
imageUrl✅—Public source image URL.
prompt—Optional guidance for imageTo3D/shapeGen (max 600 chars).
meshtexGen only—AIR 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 1–150. Scales cost linearly (see below).
cfgScale5 (v2/v2-mini), 7.5 (v2.1)Range 0–30.
octreeResolution256Range 16–512. Higher = finer mesh; scales cost linearly.
resolution3072 (v2/v2-mini), 4096 (v2.1)Shape resolution. Range 1–8192.
samplereulerComfyUI sampler (e.g. dpmpp_2m, uni_pc).
schedulernormalnormal, karras, exponential, sgm_uniform, simple, ddim_uniform, beta.
vaeNumChunks8000Range 1000–500000. VAE decode chunking.
meshThreshold0.6Range 0–1. 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 expire — see Reading results.

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. 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 ​

Preview the exact charge with whatif=true (Payments (Buzz)).

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.

Meshy v7.1 uses FAL's rates with 30% markup. Resolution surcharges were verified against live FAL billing; its model-card pricing summary omits them.

ConfigurationBuzz
Bare geometry: text mode: "preview", or image shouldTexture: false1040
Textured: text mode: "full", or image shouldTexture: true1560
Use geometryResolution: "2k"+260
Use geometryResolution: "4k" (text/single-image only)+520
Add rigging+260
Add animation (requires rigging)+156
Textured, rigged and animated at standard resolution1976

The same pricing applies to all three operations. A textured 2K model costs 1820 Buzz; a textured 4K model costs 2080 Buzz. Mesh mode, PBR and number of reference images add no surcharge.

Tripo is driven by texture fidelity plus the quad surcharge:

buzz = textureBuzz + (quad ? 65 : 0)
textureBuzz = 260 (no) | 390 (standard, or "no" with pbr) | 520 (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 ​

Timeouts, moderation blocks and expired blob URLs: see Common troubleshooting.

SymptomLikely causeFix
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.

Civitai Developer Documentation