Meshy Print Repair API Documentation
Playground
Try it on WaveSpeedAI!Meshy Print Repair repairs a 3D model for printing: closes holes and fixes broken geometry. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Meshy Print Repair repairs common mesh issues in an existing 3D model to make it more suitable for 3D printing. It can fix holes, non-manifold geometry, degenerate faces, and other topology issues, with optional wall-thickness settings based on the intended printer and print size.
Why Choose This?
- Mesh repair — Fix holes, non-manifold geometry, and other topology issues.
- Wall-thickness support — Use printer and print-size settings to address walls that may be too thin.
- Multiple 3D formats — Process common model formats including GLB, GLTF, FBX, OBJ, and STL.
- Print preparation — Create a repaired model for further inspection and slicing.
Parameters
| Parameter | Required | Description |
|---|---|---|
| model | Yes | Source 3D model in GLB, GLTF, FBX, OBJ, or STL format. |
| printer_type | No | Printer type used to determine the wall-thickness threshold. Options: fdm, sla, or full_color. |
| intended_print_height_mm | No | Intended print height in millimeters for wall-thickness evaluation. Supported for GLB inputs. |
How to Use
- Upload a model — Provide the 3D file you want to repair.
- Set print options optional — Select a printer type and intended print height when wall-thickness handling is needed.
- Submit — Process the model and retrieve the repaired result.
- Inspect before printing — Review the repaired model in your preferred slicer or 3D software.
Pricing
$0.40 per model.
Printer type and intended print height do not add separate charges.
Best Use Cases
- 3D print preparation — Repair model topology before slicing.
- Hole repair — Close gaps and open areas in a mesh.
- Non-manifold cleanup — Fix geometry that may cause problems during printing.
- Wall-thickness preparation — Adjust models based on the intended printer and print size.
- Model cleanup — Prepare generated or imported 3D assets for downstream print workflows.
Pro Tips
- Inspect the model before and after repair to check important geometric details.
- Set
printer_typewhen wall thickness matters for your printing process. - Use
intended_print_height_mmwhen working with GLB models and you know the planned print size. - Always review the repaired model in your slicer before starting a print.
Notes
- Repair may modify the model geometry.
- Existing textures are removed during repair because geometry changes can invalidate the original texture mapping.
intended_print_height_mmis supported for GLB inputs.- The intended print height is used for wall-thickness evaluation and does not resize the model.
- The repaired model keeps the input model’s file format.
- Review the repaired model in a 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",
"printer_type": "fdm"
}
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/repair" \
-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
doneRetry temporary errors only while polling, never the submit request. Errors, retries and timeouts
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| model | string | Yes | - | - | The 3D model to process (GLB, GLTF, FBX, OBJ or STL). |
| printer_type | string | No | - | fdm, sla, full_color | Printer type that sets the minimum wall thickness. |
| intended_print_height_mm | number | No | - | - | Planned print height in millimeters, for the wall-thickness check (GLB only). |
Every model also accepts the global request options enable_sync_mode and enable_base64_output; see their pages for details.
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<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.urls | object | Object containing related API endpoints |
| data.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |