
Carved Walnut Humpback
meshy/v6/image-to-3dMeshy 6 Image to 3D turns a single object image into a 3D model with configurable topology, symmetry, and texture generation. Use the image as a shape reference, then adjust remeshing and material guidance for the generated asset.
Meshy 6 Image to 3D API
Submit Meshy 6 Image 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 image_urls value inside input.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "meshy/v6/image-to-3d",
"input": {
"image_urls": [
"https://example.com/object-front.png"
],
"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/image-to-3d",
"input": {
"image_urls": [
"https://example.com/object-front.png"
],
"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/image-to-3d |
| input | object | Yes | — | Generation settings for this endpoint. |
| input.image_urls | array | Yes | — | Provide one publicly accessible HTTP(S) image URL showing the object. |
| 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.should_texture | boolean | No | true | Generate textures from the reference images. Default: true. |
| 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.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 | one reference image | Provide exactly one publicly accessible HTTP(S) image URL. |
| 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 Image to 3D is a Meshy model for creating a 3D asset from one reference image. It uses the object image with topology, remeshing, symmetry, and texture controls to generate a model. Texture generation and PBR options guide material work, while pose, rigging, and animation settings support humanoid assets. You can submit a request through the API or try the model in the Playground on this page.
Provide exactly one publicly accessible image showing the object with a clear outline and visible main parts. That single image is the shape reference for this endpoint.
Set should_texture to true to generate textures from the image; true is the default. Use texture_prompt or texture_image_url to add surface guidance.
Choose triangle or quad topology and set an integer target_polycount. The should_remesh setting applies the mesh controls, while symmetry_mode sets off, auto, or on.
Provide texture_image_url as a publicly accessible image URL, or use texture_prompt to describe the intended colors and surface patterns. Both fields are available for texture guidance.
Set enable_pbr to true to request metallic, roughness, and normal maps for the generated material.
Choose a-pose or t-pose with pose_mode, then enable_rigging for a skeleton. Set enable_animation to true with rigging enabled to apply an animation preset.
Choose Image to 3D when one reference image describes the object. Choose Meshy 6 Multi Image to 3D when you have one to four images of the same object from different angles.