Meshy V6 Multi Image To 3d API Documentation

Meshy V6 Multi Image To 3d API Documentation

Playground

Try it on WaveSpeedAI!

Meshy 6 Multi-Image-to-3D turns 1 to 4 views of one object into a textured 3D model. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Features

Meshy 6 Multi-Image-to-3D turns 1 to 4 views of one object into a textured 3D model, powered by Meshy.


Why Choose This?

  • Official Meshy models The same Meshy models used in the Meshy app, served as a REST API.

  • Production-ready output Download the result as a 3D file ready for game engines, DCC tools, AR and 3D printing.

  • Pay per task No subscription; you pay only for what you run.


Parameters

ParameterRequiredDescription
imagesYes1 to 4 images of the same object from different angles.
should_textureNoTexture the model. Turn off for an untextured mesh at a lower price. Default: true.
texture_promptNoOptional description of the texture.
texture_imageNoOptional reference image for the texture. Takes priority over texture_prompt.
enable_pbrNoGenerate PBR maps (metallic, roughness, normal). Default: false.
texture_resolutionNoTexture resolution: 2k, 4k or 8k (8k costs more). Options: 2k, 4k, 8k. Default: 2k.
topologyNoMesh topology. Options: triangle, quad. Default: triangle.
target_polycountNoTarget number of polygons (used when should_remesh is on). Default: 30000.
should_remeshNoRemesh to the target polycount and topology. Default: true.
symmetry_modeNoNo longer has an effect; kept for compatibility. Options: off, auto, on. Default: auto.
pose_modeNoGenerate characters in an A-pose or T-pose (useful before rigging). Options: a-pose, t-pose.
remove_lightingNoRemove baked-in lighting from the textures.
auto_sizeNoEstimate the real-world size of the object and scale the model to it. Default: false.
image_enhancementNoEnhance the input image before generation.
enable_riggingNoRig the generated character (humanoids). The rigged model is returned after the model. Default: false.
rigging_height_metersNoCharacter height in meters used for rigging. Default: 1.7.
enable_animationNoRig and animate the character with animation_action_id. The animated model is returned last. Default: false.
animation_action_idNoAnimation from the Meshy animation library (https://docs.meshy.ai/en/api/animation-library) applied when enable_animation is on. Default: 92.

Pricing

Textured $1.44; untextured $0.96; 8k texture +$0.24; rigging +$0.24, animation +$0.14.


How to Use

  1. Upload 1 to 4 views of the same object.
  2. Adjust the options you need, or keep the defaults.
  3. Submit — download the 3D file when it is ready.

Authentication

For authentication details, please refer to the Authentication Guide.

API Endpoints

Submit Task & Query Result

set -euo pipefail

export WAVESPEED_API_KEY="your-api-key"

REQUEST_BODY=$(cat <<'JSON'
{
  "images": [
    "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
  ],
  "should_texture": true,
  "enable_pbr": false,
  "texture_resolution": "2k",
  "topology": "triangle",
  "target_polycount": 30000,
  "should_remesh": true,
  "symmetry_mode": "auto",
  "pose_mode": "a-pose",
  "auto_size": false,
  "enable_rigging": false,
  "rigging_height_meters": 1.7,
  "enable_animation": false,
  "animation_action_id": 92
}
JSON
)

# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  --connect-timeout 10 --max-time 60 \
  -X POST "https://api.wavespeed.ai/api/v3/meshy/v6/multi-image-to-3d" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}"); then
  printf 'Submit failed. %s\n' "${CHECK}" >&2
  exit 1
fi

TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
  printf 'Submission response did not contain a prediction id. %s\n' "${CHECK}" >&2
  exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"

# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
  # Transient errors (429, 5xx) are retried, honoring Retry-After.
  HTTP_CODE=$(curl --silent --show-error --fail-with-body \
    --connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
    --output "${BODY_FILE}" --write-out '%{http_code}' \
    "${RESULT_URL}" \
    -H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
  case "${HTTP_CODE}" in
    2??) ;;
    000|429|5??)  # dropped connection or temporary error: keep polling
      printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      sleep 10; continue ;;
    *) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      cat "${BODY_FILE}" >&2; exit 1 ;;
  esac
  RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout|deleted)
      printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
      printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    *) sleep 2 ;;
  esac
done

Retry temporary errors only while polling, never the submit request. Errors, retries and timeouts

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
imagesarray<string>Yes-1 ~ 4 items1 to 4 images of the same object from different angles.
should_texturebooleanNotrue-Texture the model. Turn off for an untextured mesh at a lower price.
texture_promptstringNo--Optional description of the texture.
texture_imagestringNo--Optional reference image for the texture. Takes priority over texture_prompt.
enable_pbrbooleanNofalse-Generate PBR maps (metallic, roughness, normal).
texture_resolutionstringNo2k2k, 4k, 8kTexture resolution: 2k, 4k or 8k (8k costs more).
topologystringNotriangletriangle, quadMesh topology.
target_polycountintegerNo30000100 ~ 300000Target number of polygons (used when should_remesh is on).
should_remeshbooleanNotrue-Remesh to the target polycount and topology.
symmetry_modestringNoautooff, auto, onNo longer has an effect; kept for compatibility.
pose_modestringNo-a-pose, t-poseGenerate characters in an A-pose or T-pose (useful before rigging).
remove_lightingbooleanNo--Remove baked-in lighting from the textures.
auto_sizebooleanNofalse-Estimate the real-world size of the object and scale the model to it.
image_enhancementbooleanNo--Enhance the input image before generation.
enable_riggingbooleanNofalse-Rig the generated character (humanoids). The rigged model is returned after the model.
rigging_height_metersnumberNo1.7-Character height in meters used for rigging.
enable_animationbooleanNofalse-Rig and animate the character with animation_action_id. The animated model is returned last.
animation_action_idintegerNo92-Animation from the Meshy animation library (https://docs.meshy.ai/en/api/animation-library) applied when enable_animation is on.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.statusstringTask status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses.
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<string | object>Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model.
data.urlsobjectObject containing related API endpoints
data.statusstringStatus: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.