# tripo3d/p2/multiview-to-3d

> Tripo3D P2 Multiview-to-3D turns 2 to 4 views of one object 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.

## Overview

- **Endpoint**: `https://api.wavespeed.ai/api/v3/tripo3d/p2/multiview-to-3d`
- **Polling/result URL**: `https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result`
- **Model ID**: `tripo3d/p2/multiview-to-3d`
- **Category**: image-to-3d

## API Information

This model can be used via our HTTP API or more conveniently via our client libraries.
The API is asynchronous: submit a prediction, then poll its result URL until it completes.

### Input Schema

The API accepts the following input parameters:

- **`images`** (`array of string`, _required_):
  2 to 4 images of the same object, in the order front, left, back, right. The front view is required.

- **`texture`** (`boolean`, _optional_):
  Generate texture maps. Turn off (with pbr) for an untextured model at a lower price.
  - Default: `true`

- **`pbr`** (`boolean`, _optional_):
  Generate PBR materials (base color, metallic, roughness, normal). Turning it on also turns on texture.
  - Default: `true`

- **`texture_quality`** (`string`, _optional_):
  Texture quality: standard, detailed (high resolution), extreme (8K) or fast (same size as standard, quicker; uses texture model v3.5-20260815).
  - Default: `"standard"`
  - Options: "standard", "detailed", "extreme", "fast"

- **`texture_version`** (`string`, _optional_):
  Texture model. v3.5-20260815 is the newest; the fast quality and delight use it.
  - Default: `"v3.0-20250812"`
  - Options: "v3.0-20250812", "v3.5-20260815"

- **`delight`** (`boolean`, _optional_):
  Remove the lighting baked into the source before texturing (texture model v3.5-20260815 only).
  - Default: `true`

- **`quad`** (`boolean`, _optional_):
  Output a native quad mesh (FBX).
  - Default: `false`

- **`face_limit`** (`integer`, _optional_):
  Maximum 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.
  - Range: `48` to `50000`

- **`texture_alignment`** (`string`, _optional_):
  What the texture follows: the source image colors or the generated geometry.
  - Default: `"original_image"`
  - Options: "original_image", "geometry"

- **`orientation`** (`string`, _optional_):
  align_image rotates the model to the source image viewpoint (textured models only).
  - Default: `"default"`
  - Options: "default", "align_image"

- **`enable_image_autofix`** (`boolean`, _optional_):
  Improve a low-quality source image before generation. Takes longer.
  - Default: `false`

- **`auto_size`** (`boolean`, _optional_):
  Scale the model to real-world size in meters. Needs a textured model.
  - Default: `false`

- **`export_uv`** (`boolean`, _optional_):
  Unwrap UVs during generation. Turn off for faster generation and a smaller file.
  - Default: `true`

- **`model_seed`** (`integer`, _optional_):
  Seed for the geometry: the same seed and input give the same mesh.

- **`texture_seed`** (`integer`, _optional_):
  Seed for the texture: keep model_seed and change texture_seed for new textures on the same mesh.



**Required Parameters Example**:

```json
{
  "images": [
    "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
  ]
}
```

**Full Example**:

```json
{
  "images": [
    "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "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,
  "face_limit": 48,
  "texture_alignment": "original_image",
  "orientation": "default",
  "enable_image_autofix": false,
  "auto_size": false,
  "export_uv": true,
  "model_seed": 0,
  "texture_seed": 0
}
```

### Result Data Schema

The `data` object returned by the API has the following fields:

- **`created_at`** (`string (date-time)`, _optional_):
  ISO timestamp of when the request was created (e.g., "2023-04-01T12:34:56.789Z").

- **`id`** (`string`, _optional_):
  Unique identifier for the prediction, the ID of the prediction to get.

- **`model`** (`string`, _optional_):
  Model ID used for the prediction.

- **`outputs`** (`array of string | object`, _optional_):
  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.

- **`status`** (`string`, _optional_):
  Status of the task: created, processing, completed, or failed.

- **`urls`** (`object`, _optional_):
  Object containing related API endpoints.



**Example `data` Object**:

```json
{
  "created_at": "example",
  "id": "example",
  "model": "example",
  "outputs": [],
  "status": "example",
  "urls": {}
}
```

## Usage Examples

The examples use `jq` to read JSON. Set your API key first:

```bash
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
```

### 1. Submit a prediction

```bash
REQUEST_BODY=$(cat <<'JSON'
{
  "images": [
    "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
  ]
}
JSON
)

SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  --request POST \
  --url https://api.wavespeed.ai/api/v3/tripo3d/p2/multiview-to-3d \
  --header "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  --header "Content-Type: application/json" \
  --data "${REQUEST_BODY}")

printf '%s\n' "${SUBMIT_RESPONSE}" | jq .
```

The response contains the prediction ID in `data.id`.

### 2. Poll until complete and read `outputs`

```bash
PREDICTION_ID=$(printf '%s' "${SUBMIT_RESPONSE}" | jq -r '.data.id')
if [ -z "${PREDICTION_ID}" ] || [ "${PREDICTION_ID}" = "null" ]; then
  printf 'Submission response did not contain data.id\n' >&2
  exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"

while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body \
    --request GET \
    --url "${RESULT_URL}" \
    --header "Authorization: Bearer ${WAVESPEED_API_KEY}")

  RESULT=$(printf '%s' "${RESPONSE}" | jq -e '.data')
  STATUS=$(printf '%s' "${RESULT}" | jq -er '.status')
  case "${STATUS}" in
    completed)
      # Generated files are returned in the outputs array.
      printf '%s\n' "${RESULT}" | jq '.outputs'
      break
      ;;
    failed|cancelled|timeout|deleted)
      printf '%s\n' "${RESULT}" | jq '{status, error, code}'
      exit 1
      ;;
    *)
      sleep 2
      ;;
  esac
done
```

## Additional Resources

### Documentation

- [Model Playground](https://wavespeed.ai/models/tripo3d/p2/multiview-to-3d)
- [API Documentation](https://wavespeed.ai/docs/docs-api/tripo3d/tripo3d-p2-multiview-to-3d)
