
Exposed-Joinery Elm Stool
meshy/v6/multi-image-to-3dMeshy 6 Multi Image to 3D builds a 3D model from one to four views of the same object with topology and texture controls. Provide complementary angles, then adjust remeshing and material guidance for the generated mesh.
Meshy 6 Multi Image to 3D API
Submit Meshy 6 Multi 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/multi-image-to-3d",
"input": {
"image_urls": [
"https://example.com/object-front.png",
"https://example.com/object-side.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/multi-image-to-3d",
"input": {
"image_urls": [
"https://example.com/object-front.png",
"https://example.com/object-side.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/multi-image-to-3d |
| input | object | Yes | — | Generation settings for this endpoint. |
| input.image_urls | array | Yes | — | Provide 1–4 publicly accessible HTTP(S) image URLs showing the same object from different angles. |
| 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 to four images of the same object | Provide 1–4 publicly accessible HTTP(S) images showing the same object from different angles. |
| 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 Multi Image to 3D is a Meshy model for creating 3D assets from one to four images of the same object. It combines different views with topology, remeshing, symmetry, and texture controls to build the model. PBR material maps and optional humanoid rigging and animation settings extend asset preparation. You can submit a request through the API or try the multiview workflow in the Playground on this page.
Submit one to four publicly accessible image URLs showing the same object. Different angles can supply complementary shape references.
Use available front, side, back, or three-quarter views of the same object. Select angles that reveal the parts you want represented in the mesh.
Keep the full object visible and use similar framing across the images. Make sure handles, thin parts, and other shape details can be seen in the relevant views.
Choose triangle or quad topology, set an integer target_polycount, and use should_remesh to apply those settings. symmetry_mode offers off, auto, and on.
Set should_texture to true to generate textures from the reference set. Use texture_prompt for written surface details, texture_image_url for an image reference, and enable_pbr for material maps.
Set enable_rigging to true to add a skeleton to a humanoid model. Set enable_animation to true with rigging enabled and choose an animation_action_id preset.
Use Multi Image to 3D when you have several angles of one object to supply together. Meshy 6 Image to 3D takes one reference image.