
Wind-carved sandstone arch
hunyuan-3d/v3.1/pro/text-to-3dHunyuan 3D v3.1 Pro Text to 3D creates 3D assets from written descriptions with adjustable face counts and PBR materials. Choose textured or geometry output, then tune mesh complexity to prepare the object for your scene.
Hunyuan 3D v3.1 Pro Text to 3D API
Submit the input, retain the task_id, and retrieve the completed model files.
Send your Vidgo API key with Bearer authentication.
https://api.vidgo.ai/api/generate/submitPlace model at the root and generation settings inside input.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "hunyuan-3d/v3.1/pro/text-to-3d",
"input": {
"generate_type": "Normal",
"face_count": 500000,
"enable_pbr": true,
"prompt": "A freestanding ancient bronze incense censer, squat rounded vessel on three stout feet, two thick upright loop handles and a fitted domed lid. Deep symmetrical guardian-beast relief around the body, raised spiral bands, aged green patina in recesses and worn golden bronze on edges. One complete museum artifact, no smoke, no text, no pedestal."
}
}
JSON
)
RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"Query the returned task_id until the status is finished or failed.
GET https://api.vidgo.ai/api/generate/status/{task_id}Query the task and read files when its status is finished.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "UYBWGJ3Q31BAHM9Y",
"status": "running",
"created_time": "2026-09-27T21:57:02"
}
}{
"code": 200,
"data": {
"task_id": "UYBWGJ3Q31BAHM9Y",
"status": "finished",
"files": [
{
"file_url": "https://cdn.vidgo.ai/apis/models/hunyuan-3d/v3.1/pro/text-to-3d/v1/01/CG8M1YEW2X5OSI70_1.glb",
"file_type": "3d"
},
{
"file_url": "https://cdn.vidgo.ai/apis/models/hunyuan-3d/v3.1/pro/text-to-3d/v1/01/CG8M1YEW2X5OSI70_2.png",
"file_type": "image"
},
{
"file_url": "https://cdn.vidgo.ai/apis/models/hunyuan-3d/v3.1/pro/text-to-3d/v1/01/material.mtl",
"file_type": "3d"
},
{
"file_url": "https://cdn.vidgo.ai/apis/models/hunyuan-3d/v3.1/pro/text-to-3d/v1/01/CG8M1YEW2X5OSI70_4.obj",
"file_type": "3d"
},
{
"file_url": "https://cdn.vidgo.ai/apis/models/hunyuan-3d/v3.1/pro/text-to-3d/v1/01/texture_pbr_20250901_normal.png",
"file_type": "image"
}
],
"created_time": "2026-09-27T21:57:02",
"error_message": null,
"progress": 100
}
}Read every files item for its file_url, file_type, label, and format.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "hunyuan-3d/v3.1/pro/text-to-3d",
"input": {
"generate_type": "Normal",
"face_count": 500000,
"enable_pbr": true,
"prompt": "A freestanding ancient bronze incense censer, squat rounded vessel on three stout feet, two thick upright loop handles and a fitted domed lid. Deep symmetrical guardian-beast relief around the body, raised spiral bands, aged green patina in recesses and worn golden bronze on edges. One complete museum artifact, no smoke, no text, no pedestal."
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
donePlace generation parameters inside input; keep model and callback_url at the root.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| model | string | Yes | — | hunyuan-3d/v3.1/pro/text-to-3d |
| input | object | Yes | — | Inputs and controls for this generation. |
| input.prompt | string | Yes | — | Describe the object, shape, and materials in 1–1024 characters. |
| input.generate_type | string | No | — | Choose Normal for a textured model or Geometry for a geometry-only white model. |
| input.face_count | integer | No | 500000 | Set an integer target face count from 40000 to 1500000. Default: 500000. |
| input.enable_pbr | boolean | No | — | Set true to generate PBR materials in textured mode. Geometry mode takes precedence. |
| callback_url | string | No | — | Public HTTP(S) URL for task completion notifications. |
The task response contains status, progress, and generated files.
| Field | Type | Description |
|---|---|---|
| code | integer | Response code. |
| data.task_id | string | Task identifier. |
| data.status | string | not_started, running, finished, failed |
| data.progress | integer | Generation progress from 0 to 100. |
| data.files | array | Generated model, image, and companion files. |
| data.files[].file_url | string | File download URL. |
| data.files[].file_type | string | 3d, image, or other. |
| data.files[].label | string | File role, such as model_glb or thumbnail. |
| data.files[].format | string | File format, such as glb or png. |
| data.files[].file_name | string | File name when provided. |
| data.files[].file_size | integer | File size in bytes when provided. |
| data.error_message | string | null | Task error details. |
Use the task state to decide when to check again or read the result.
not_startedThe task has been accepted and is waiting to start.
running3D model generation is in progress. Continue checking the same task.
finishedGeneration is complete. Read files to retrieve the 3D assets.
failedGeneration failed. Read error_message before deciding whether to submit a new request.
| Item | Value | Description |
|---|---|---|
| Input | prompt | Describe the object, shape, and materials in 1–1024 characters. |
| Generation mode | Normal / Geometry | Choose Normal for a textured model or Geometry for a geometry-only white model. |
| Materials | enable_pbr | Set true to generate PBR materials in textured mode. Geometry mode takes precedence. |
Hunyuan 3D v3.1 Pro Text to 3D is a Tencent model for generating 3D objects from written descriptions. Guide the asset with the subject, main forms, proportions, and surface materials in a prompt of up to 1024 characters. Face-count and generation-mode controls guide geometry, while PBR settings guide material generation. You can call it programmatically or try it from the playground above.
Describe one object, its silhouette, main parts, and materials within 1024 characters. For example, specify a rounded ceramic teapot, a short spout, a loop handle, and a blue glazed surface.
Set face_count to an integer from 40000 to 1500000. The default target is 500000. Choose the target around the mesh complexity you want to review; it is a generation target rather than a measured count of the returned mesh.
Set generate_type to Geometry. This creates geometry-only output for shape review. Keep the same prompt while adjusting face_count to explore the mesh target.
Use generate_type: Normal and enable_pbr: true. Describe the intended materials in prompt, then retrieve the material and texture files returned with the model.
Choose Pro Text to 3D when you want a prompt of up to 1024 characters and a configurable face count. Rapid Text to 3D provides a 200-character prompt workflow with a geometry switch and PBR control.
Keep the subject and main proportions consistent, then change one detail such as the handle shape or surface material in each prompt. Compare the returned models from several viewing angles.
Inspect the generated GLB in the 3D preview when it is returned, then download the model and companion files. Import the returned format into your 3D application and review scale, placement, and materials in the target scene.