
Mossy Stone Arch Terrain
meshy/v6/text-to-3dMeshy 6 Text to 3D turns an object description into a 3D model with selectable topology, remeshing, and texture guidance. Choose a geometry preview or the full workflow, then refine the mesh and material settings for your asset.
Meshy 6 Text to 3D API
Submit Meshy 6 Text to 3D inputs, retain task_id, and query the task for the returned files.
Send your Vidgo API key in the Bearer authorization header.
https://api.vidgo.ai/api/generate/submitPlace model at the request root and the prompt value inside input.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "meshy/v6/text-to-3d",
"input": {
"prompt": "A leather backpack with brass buckles and canvas straps",
"mode": "full",
"topology": "triangle",
"target_polycount": 30000,
"should_remesh": true,
"symmetry_mode": "auto"
}
}
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 status is finished or failed.
GET https://api.vidgo.ai/api/generate/status/{task_id}When status is finished, inspect files and download the returned assets.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "your_task_id",
"status": "not_started",
"created_time": "2026-09-27T10:00:00"
}
}{
"code": 200,
"data": {
"task_id": "your_task_id",
"status": "finished",
"files": [
{
"file_url": "https://example.com/model.glb",
"file_type": "3d",
"label": "model_glb",
"format": "glb",
"file_name": "model.glb"
},
{
"file_url": "https://example.com/preview.png",
"file_type": "image",
"label": "thumbnail",
"format": "png"
}
],
"progress": 100,
"error_message": null
}
}Read each returned files item for 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": "meshy/v6/text-to-3d",
"input": {
"prompt": "A leather backpack with brass buckles and canvas straps",
"mode": "full",
"topology": "triangle",
"target_polycount": 30000,
"should_remesh": true,
"symmetry_mode": "auto"
}
}
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 model and optional callback_url at the request root; put the fields listed below inside input.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| model | string | Yes | — | meshy/v6/text-to-3d |
| input | object | Yes | — | Generation settings for this endpoint. |
| input.prompt | string | Yes | — | Describe the object, its main parts, shape, and materials in 1–600 characters. |
| input.mode | string | No | full | Choose preview for a geometry preview or full for the complete generation. Default: full. |
| input.seed | integer | No | — | Set an integer seed to repeat the same generation settings. |
| input.topology | string | No | triangle | Choose triangle or quad mesh topology. Default: triangle. |
| input.target_polycount | integer | No | 30000 | Set the target polygon count as an integer. Default: 30000. |
| input.should_remesh | boolean | No | true | Enable remeshing to apply the chosen topology and polygon target. Default: true. |
| input.symmetry_mode | string | No | auto | Choose off, auto, or on for symmetry. Default: auto. |
| input.enable_pbr | boolean | No | — | Generate PBR material maps for metallic, roughness, and normal details. |
| input.pose_mode | string | No | "" | Choose a-pose, t-pose, or an empty string for the model pose. Default: empty string. |
| input.enable_prompt_expansion | boolean | No | — | Expand the text prompt to add detail for generation. |
| input.texture_prompt | string | No | — | Describe colors, patterns, and materials to guide the texture. |
| input.texture_image_url | string | No | — | Provide a publicly accessible HTTP(S) image URL as a texture reference. |
| input.enable_rigging | boolean | No | — | Add a skeleton to a humanoid character for posing and animation. |
| input.rigging_height_meters | number | No | 1.7 | Set the character height in meters when rigging. Default: 1.7. |
| input.enable_animation | boolean | No | — | Apply an animation preset with enable_rigging set to true. |
| input.animation_action_id | integer | No | 1001 | Select an integer animation preset ID. Default: 1001. |
| input.enable_safety_checker | boolean | No | true | Enable input safety checking. Default: true. |
| callback_url | string | No | — | Provide a public HTTP(S) URL for completed or failed task notifications. |
The status response reports task state, progress, and returned files.
| Field | Type | Description |
|---|---|---|
| code | integer | API response code. |
| data.task_id | string | Task ID for status queries. |
| data.status | string | Task state: not_started, running, finished, or failed. |
| data.progress | integer | Reported generation progress from 0 to 100. |
| data.files | array | Generated model, preview image, and companion files. |
| data.files[].file_url | string | URL for a returned file. |
| data.files[].file_type | string | File category: 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 | Error details for a failed task. |
Use task_id to check the same generation until it finishes or fails.
not_startedThe task has been accepted and awaits generation.
runningThe 3D model is being generated; continue querying this task.
finishedGeneration is complete; read files for the assets.
failedThe task failed; read error_message before submitting another request.
| Item | Value | Description |
|---|---|---|
| Input | a written object description | Describe the object, shape, and materials in 1–600 characters. |
| Topology | triangle, quad | Choose triangle or quad mesh topology. Default: triangle. |
| Output files | GLB, FBX, OBJ, USDZ, BLEND, STL | Read the files returned by the task for model formats, textures, and animation assets. |
Meshy 6 Text to 3D is a Meshy model for creating 3D assets from written object descriptions. It turns a prompt into a model with topology, remeshing, symmetry, and texture controls. Preview and full modes let you check geometry or use the complete workflow, while PBR, rigging, and animation settings extend material and humanoid asset work. You can submit a request through the API or try the model in the Playground on this page.
Describe one object, its main parts, silhouette, and materials in the required prompt of up to 600 characters. Clear component and surface details give the model a concrete shape and material direction.
Choose mode=preview to check geometry before using mode=full for the complete generation workflow. The default mode is full.
Set enable_prompt_expansion to true to expand the text prompt for generation. An integer seed can also be supplied when repeating a generation configuration.
Choose triangle or quad topology, set an integer target_polycount, and use should_remesh to apply the mesh settings. symmetry_mode offers off, auto, and on.
Describe surface colors and patterns with texture_prompt, provide a texture_image_url, and set enable_pbr to request metallic, roughness, and normal maps.
Set enable_rigging to true for a skeleton, then set enable_animation to true to apply an animation_action_id preset. Character height can be set with rigging_height_meters.
Set pose_mode to a-pose or t-pose when preparing a humanoid character. The default empty string leaves the pose unspecified.