Meshy Print Multi Color API Documentation

Meshy Print Multi Color API Documentation

Playground

Try it on WaveSpeedAI!

Meshy Multi-Color Print turns a textured 3D model into a multi-color 3MF ready for the slicer. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Features

Meshy Multi-Color Print converts a 3D model with color information into a multi-color 3MF file for 3D printing. Choose the palette size, color style, detail level, and printer brand preset for the final print-ready asset.


Why Choose This?

  • Multi-color conversion — Convert an existing 3D model into color regions for multi-color printing.
  • Up to 16 colors — Choose the maximum number of colors in the output palette.
  • Realistic and cartoon styles — Preserve finer color variation or simplify colors into cleaner regions.
  • Adjustable color detail — Control how much texture detail is captured in realistic mode.
  • Printer presets — Include a slicer preset for supported printer brands.
  • 3MF output — Generate a multi-color file for further review and printing.

Parameters

ParameterRequiredDescription
modelYesSource 3D model with color information.
styleNoColor-region style: realistic or cartoon. Default: realistic.
max_colorsNoMaximum number of colors in the output palette, from 1 to 16. Default: 4.
max_depthNoColor-detail depth from 3 to 6. Applies only to realistic style. Default: 4.
printer_brandNoPrinter brand preset included in the 3MF. Options: bambu, anycubic, creality, flashforge, snapmaker, elegoo, prusa, qidi, or ankermake. Default: bambu.

How to Use

  1. Upload a model — Provide a 3D model with color information.
  2. Choose a style — Use realistic for finer color detail or cartoon for cleaner color regions.
  3. Set the palette — Choose up to 16 colors.
  4. Adjust detail optional — Set max_depth when using realistic mode.
  5. Choose a printer preset — Select the intended printer brand.
  6. Submit — Generate and retrieve the multi-color 3MF file.
  7. Review before printing — Open the result in your slicer and verify color and printer settings.

Pricing

$0.40 per model.

Style, color count, detail depth, and printer preset do not add separate charges.


Best Use Cases

  • Multi-color figurines — Prepare colored characters and collectibles for printing.
  • Product models — Convert textured product assets into printable color regions.
  • Decorative models — Prepare colorful ornaments, props, and display pieces.
  • Stylized prints — Use cartoon mode for cleaner and simpler color separation.
  • Detailed color prints — Use realistic mode when finer texture-based color detail is important.

Pro Tips

  • Use realistic when preserving finer texture colors is important.
  • Use cartoon when you want cleaner, more uniform color regions.
  • Increase max_colors when the model contains several important colors.
  • Increase max_depth when realistic mode needs finer color detail.
  • Review the generated color assignments in your slicer before printing.

Notes

  • Output is a multi-color 3MF file.
  • max_colors supports values from 1 to 16 and defaults to 4.
  • style defaults to realistic.
  • realistic uses the model’s texture colors and requires valid texture and UV information.
  • cartoon creates simplified color regions and can work with supported model color information.
  • max_depth supports values from 3 to 6 and applies only to realistic.
  • printer_brand defaults to bambu.
  • The selected printer brand determines the slicer preset included in the 3MF.
  • Review color assignments and printer settings in your slicer before printing.

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'
{
  "model": "example",
  "style": "realistic",
  "max_colors": 4,
  "max_depth": 4,
  "printer_brand": "bambu"
}
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/print/multi-color" \
  -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
modelstringYes--The 3D model to process (GLB, GLTF, FBX, OBJ or STL).
stylestringNorealisticrealistic, cartoonColor placement style.
max_colorsintegerNo41 ~ 16Number of colors.
max_depthintegerNo43 ~ 6Detail depth of the color regions (realistic style).
printer_brandstringNobambubambu, anycubic, creality, flashforge, snapmaker, elegoo, prusa, qidi, ankermakeSlicer preset written into the 3MF.

Every model also accepts the global request options enable_sync_mode and enable_base64_output; see their pages for details.

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.