Meshy 7 Retexture applies new textures to existing 3D models using text prompts or reference images, with 2K, 4K, and 8K base-color textures plus optional PBR maps for game assets, product visualization, 3D design, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Idle
/filters:quality(85)/examples/be2996adb3ac0889ba6e188803ae0df9/eeaf812d-82db-450d-a1e8-c797b29ddf06-cc6af5da038b.webp)
/filters:quality(85)/examples/be2996adb3ac0889ba6e188803ae0df9/5df019bd-046d-42ba-bb86-19326976d10f-4804e6593e27.webp)
$0.33per run·~30 / $10
Retexture this backpack with aged burgundy leather, dark brown straps, antique brass buckles, and a charcoal wool blanket. Give the three potion bottles distinct emerald-green, amber, and deep-violet glass finishes. Add subtle leather creases, worn edges, and restrained brass patina. Rich handcrafted fantasy materials with clean separation between leather, metal, cloth, and glass. No symbols or lettering.
Meshy 7 Retexture applies new textures and materials to an existing 3D model using either a text description or a reference image. Keep the original geometry while changing the asset's surface appearance, choose 2K, 4K, or 8K base-color textures, preserve existing UV mapping when suitable, and optionally generate PBR material maps.
It is designed for material variations, game assets, product visualization, rendering workflows, and other use cases where you want to change the look of an existing 3D model without regenerating its geometry.
Retexture existing 3D assets
Change materials, colors, finishes, and surface appearance without rebuilding the underlying model.
Text or image guidance
Describe the material you want or provide a reference image to guide the texture style.
Up to 8K textures
Choose 2K, 4K, or 8K base-color texture resolution.
UV control
Preserve the model's existing UV mapping or generate new UVs when the original mapping is unsuitable.
Optional PBR materials
Generate metallic, roughness, and normal maps alongside the base-color texture at no additional charge.
Multiple 3D input formats
Supports GLB, GLTF, OBJ, FBX, and STL source models.
| Parameter | Required | Description |
|---|---|---|
| model | Yes | 3D model file URL. Supports GLB, GLTF, OBJ, FBX, and STL. |
| prompt | Conditional | Text description of the desired material and texture. Maximum 600 characters. Required when texture_image is not provided. |
| texture_image | Conditional | Reference image URL in JPG, JPEG, or PNG format. Required when prompt is not provided. Takes priority when both are supplied. |
| texture_resolution | No | Base-color texture resolution: 2k, 4k, or 8k. Default: 2k. |
| enable_original_uv | No | Preserve the model's original UV mapping. Default: true. Disable it when new UV mapping should be generated. |
| enable_pbr | No | Generate metallic, roughness, and normal maps in addition to the base-color texture. Default: false. |
At least one of prompt or texture_image must be provided.
2k, 4k, or 8k.enable_original_uv=true when the source model has usable UVs, or disable it to generate new mapping.enable_pbr when metallic, roughness, and normal maps are needed.Pricing is based only on texture_resolution.
| Texture Resolution | Price per Request |
|---|---|
| 2K | $0.33 |
| 4K | $0.33 |
| 8K | $0.50 |
2K and 4K use the same price tier. Selecting 8K increases the price to $0.50 per request.
enable_pbr, enable_original_uv, and the choice between prompt and texture_image do not add separate charges.
Available companion files also do not incur separate per-file charges.
texture_image.enable_original_uv=true.enable_pbr when the asset will be used in lighting-sensitive rendering or real-time 3D workflows.2k or 4k for iteration before moving to 8k when maximum texture detail is needed.prompt and texture_image are supplied, the reference image takes priority.model is required.prompt or texture_image must be provided.prompt supports up to 600 characters.texture_image supports JPG, JPEG, and PNG.texture_image takes priority when both guidance methods are supplied.texture_resolution defaults to 2k.2k, 4k, and 8k.enable_original_uv defaults to true.enable_pbr defaults to false.8k, the base-color texture is 8192 pixels, while PBR maps are 4096 pixels.Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/meshy/v7/retexture with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for v7 Retexture below.
set -euo pipefail
: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "example",
"texture_resolution": "2k",
"enable_original_uv": true,
"enable_pbr": false,
"prompt": "A cinematic shot of a city at sunset, soft golden light"
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/meshy/v7/retexture" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WAVESPEED_API_KEY" \
-d "$REQUEST_BODY")
TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
-H "Authorization: Bearer $WAVESPEED_API_KEY")
RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
case "$STATUS" in
completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneconst submitUrl = "https://api.wavespeed.ai/api/v3/meshy/v7/retexture";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');
async function requestJson(url, options = {}) {
const response = await fetch(url, options);
if (!response.ok) throw new Error(await response.text());
return response.json();
}
// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
method: "POST",
headers: {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"model": "example",
"texture_resolution": "2k",
"enable_original_uv": true,
"enable_pbr": false,
"prompt": "A cinematic shot of a city at sunset, soft golden light"
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;
// 2. Poll until the prediction finishes.
while (true) {
const resultBody = await requestJson(resultUrl, {
headers: { "Authorization": `Bearer ${apiKey}` },
});
const result = resultBody.data ?? resultBody;
if (result.status === "completed") {
console.log(result.outputs);
break;
}
if (["failed", "cancelled", "timeout", "deleted"].includes(result.status)) throw new Error(JSON.stringify(result));
await new Promise(resolve => setTimeout(resolve, 2000));
}import json
import os
import time
from urllib.request import Request, urlopen
api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
"model": "example",
"texture_resolution": "2k",
"enable_original_uv": True,
"enable_pbr": False,
"prompt": "A cinematic shot of a city at sunset, soft golden light"
}
def request_json(url, data=None):
request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
with urlopen(request) as response:
return json.load(response)
# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/meshy/v7/retexture", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
raise RuntimeError("Submission response did not contain a prediction id")
result_url = f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"
# 2. Poll until the prediction finishes.
while True:
result_body = request_json(result_url)
result = result_body.get("data", result_body)
status = result.get("status")
if status == "completed":
print(result.get("outputs", []))
break
if status in {"failed", "cancelled", "timeout", "deleted"}:
raise RuntimeError(result)
time.sleep(2)v7 Retexture is a Meshy model for 3D asset generation from images, exposed as a REST API on WaveSpeedAI. Meshy 7 Retexture applies new textures to existing 3D models using text prompts or reference images, with 2K, 4K, and 8K base-color textures plus optional PBR maps for game assets, product visualization, 3D design, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.
POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates Python, JavaScript, and cURL examples for submitting requests and polling results. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/meshy/meshy-v7-retexture.
v7 Retexture starts at $0.33 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.
Key inputs: `prompt`, `enable_original_uv`, `enable_pbr`, `model`, `texture_image`, `texture_resolution`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/meshy/meshy-v7-retexture.
Sign up for a free WaveSpeedAI account to claim starter credits, copy your API key from /accesskey, then call the endpoint shown in the API tab of the playground. The playground also auto-generates a code sample in Python, JavaScript, or cURL for the parameters you've set.
Commercial usage rights depend on the model's license, set by its provider (Meshy). Check the provider's applicable terms and WaveSpeedAI's Terms of Service before commercial use.