Tripo3d P2 Image To 3d API Documentation

Tripo3d P2 Image To 3d API Documentation

Playground

Try it on WaveSpeedAI!

Tripo3D P2 Image-to-3D turns a single image into a 3D model with Tripo’s P2 model with native quad topology (up to 50,000 triangles or 25,000 quads) for games and real-time pipelines. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Features

Tripo3D P2 Image-to-3D generates a 3D model from a single image, with optional textures and PBR materials. Adjust the face count and choose triangle or quad output.


Why Choose This?

  • Geometry and materials — Generate geometry alone or include textures and PBR materials.
  • Texture choices — Choose standard, detailed, extreme, or fast texturing.
  • Mesh options — Adjust the face count and choose triangle or quad output.

Parameters

ParameterRequiredDescription
imageYesImage of the object (PNG, JPEG or WebP).
textureNoGenerate texture maps. Turn off (with pbr) for an untextured model at a lower price. Default: true.
pbrNoGenerate PBR materials (base color, metallic, roughness, normal). Turning it on also turns on texture. Default: true.
texture_qualityNoTexture quality: standard, detailed, extreme (8k), or fast (same texture size as standard). Options: standard, detailed, extreme, fast. Default: standard.
texture_versionNoTexture version. fast quality uses v3.5-20260815. Options: v3.0-20250812, v3.5-20260815. Default: v3.0-20250812.
delightNoRemove the lighting baked into the source before texturing (texture model v3.5-20260815 only). Default: true.
quadNoOutput a native quad mesh (FBX). Default: false.
face_limitNoMaximum number of faces: 48 to 50,000 triangles, or 48 to 25,000 quads. Omit for adaptive; 150+ for simple objects, 250+ for complex ones.
texture_alignmentNoWhat the texture follows: the source image colors or the generated geometry. Options: original_image, geometry. Default: original_image.
orientationNoalign_image rotates the model to the source image viewpoint (textured models only). Options: default, align_image. Default: default.
enable_image_autofixNoRequest input-image correction before generation. Default: false.
auto_sizeNoScale the model to real-world size in meters. Needs a textured model. Default: false.
export_uvNoUnwrap UVs during generation. Default: true.
model_seedNoOptional seed for geometry generation.
texture_seedNoOptional seed for texture generation.

How to Use

  1. Upload an image of the object.
  2. Choose geometry and texture settings.
  3. Adjust optional mesh settings.
  4. Submit the request and download the generated model.

Pricing

ConfigurationPrice per request
Geometry only$1.20
With standard or fast textures$1.32
With detailed textures$1.44
With extreme (8k) textures$1.56

Quad output does not add a separate charge.

For geometry-only output, turn off both texture and pbr. Enabling pbr also enables textures.


Notes

  • Turn off both texture and pbr for an untextured model.
  • fast uses the same texture size and price as standard and selects texture version v3.5-20260815.
  • delight affects texturing only with texture version v3.5-20260815; older texture versions ignore it.
  • Texture quality settings do not add a charge when textures are not generated.
  • auto_size estimates real-world scale and requires textured output.

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'
{
  "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
  "texture": true,
  "pbr": true,
  "texture_quality": "standard",
  "texture_version": "v3.0-20250812",
  "delight": true,
  "quad": false,
  "texture_alignment": "original_image",
  "orientation": "default",
  "enable_image_autofix": false,
  "auto_size": false,
  "export_uv": true
}
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/tripo3d/p2/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
imagestringYes-Image of the object (PNG, JPEG or WebP, up to 20 MB). A clean background and little occlusion work best.
texturebooleanNotrue-Generate texture maps. Turn off (with pbr) for an untextured model at a lower price.
pbrbooleanNotrue-Generate PBR materials (base color, metallic, roughness, normal). Turning it on also turns on texture.
texture_qualitystringNostandardstandard, detailed, extreme, fastTexture quality: standard, detailed (high resolution), extreme (8K) or fast (same size as standard, quicker; uses texture model v3.5-20260815).
texture_versionstringNov3.0-20250812v3.0-20250812, v3.5-20260815Texture model. v3.5-20260815 is the newest; the fast quality and delight use it.
delightbooleanNotrue-Remove the lighting baked into the source before texturing (texture model v3.5-20260815 only).
quadbooleanNofalse-Output a native quad mesh (FBX).
face_limitintegerNo-48 ~ 50000Maximum number of faces: 48 to 50,000 triangles, or 48 to 25,000 quads. Omit for adaptive; 150+ for simple objects, 250+ for complex ones.
texture_alignmentstringNooriginal_imageoriginal_image, geometryWhat the texture follows: the source image colors or the generated geometry.
orientationstringNodefaultdefault, align_imagealign_image rotates the model to the source image viewpoint (textured models only).
enable_image_autofixbooleanNofalse-Improve a low-quality source image before generation. Takes longer.
auto_sizebooleanNofalse-Scale the model to real-world size in meters. Needs a textured model.
export_uvbooleanNotrue-Unwrap UVs during generation. Turn off for faster generation and a smaller file.
model_seedintegerNo--Seed for the geometry: the same seed and input give the same mesh.
texture_seedintegerNo--Seed for the texture: keep model_seed and change texture_seed for new textures on the same mesh.

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.