# meshy/v7.1/multi-image-to-3d

> Meshy 7.1 Multi-Image-to-3D reconstructs textured, PBR-ready 3D models from one to four views of the same object, with 2K geometry resolution for finer detail and configurable topology, rigging, and animation for game assets, product visualization, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

## Overview

- **Endpoint**: `https://api.wavespeed.ai/api/v3/meshy/v7.1/multi-image-to-3d`
- **Polling/result URL**: `https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result`
- **Model ID**: `meshy/v7.1/multi-image-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_):
  One to four images of the same object from different angles.

- **`topology`** (`string`, _optional_):
  Mesh topology for the generated model.
  - Default: `"triangle"`
  - Options: "quad", "triangle"

- **`target_polycount`** (`integer`, _optional_):
  Target number of polygons for remeshed output.
  - Default: `30000`
  - Range: `100` to `300000`

- **`symmetry_mode`** (`string`, _optional_):
  Controls symmetry during model generation.
  - Default: `"auto"`
  - Options: "off", "auto", "on"

- **`should_remesh`** (`boolean`, _optional_):
  Enable remeshing for cleaner topology.
  - Default: `true`

- **`should_texture`** (`boolean`, _optional_):
  Generate textures for the 3D model.
  - Default: `true`

- **`enable_pbr`** (`boolean`, _optional_):
  Generate PBR maps in addition to the base color texture.
  - Default: `false`

- **`geometry_resolution`** (`string`, _optional_):
  Geometry resolution. `standard` is the default; `2k` generate denser, finer surface detail (up to 2K) at extra cost. Only applies to `standard` geometry.
  - Default: `"standard"`
  - Options: "standard", "2k"

- **`pose_mode`** (`string`, _optional_):
  Optional humanoid pose. Leave unselected for no specific pose.
  - Options: "a-pose", "t-pose"

- **`texture_prompt`** (`string`, _optional_):
  Optional text guidance for texture generation.

- **`texture_image`** (`string`, _optional_):
  Optional image to guide texture generation.

- **`enable_rigging`** (`boolean`, _optional_):
  Automatically rig a humanoid character, including basic walking and running animations.
  - Default: `false`

- **`rigging_height_meters`** (`number`, _optional_):
  Approximate character height in meters when rigging is enabled.
  - Default: `1.7`
  - Range: at least `0.01`

- **`enable_animation`** (`boolean`, _optional_):
  Apply an animation preset. Requires enable_rigging.
  - Default: `false`

- **`animation_action_id`** (`integer`, _optional_):
  Meshy animation preset ID, used only when animation is enabled.
  - Default: `92`
  - Range: `0` to `696`



**Required Parameters Example**:

```json
{
  "images": [
    "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"
  ],
  "topology": "triangle",
  "target_polycount": 30000,
  "symmetry_mode": "auto",
  "should_remesh": true,
  "should_texture": true,
  "enable_pbr": false,
  "geometry_resolution": "standard",
  "pose_mode": "a-pose",
  "texture_prompt": "A cinematic ocean wave at sunrise, highly detailed",
  "texture_image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
  "enable_rigging": false,
  "rigging_height_meters": 1.7,
  "enable_animation": false,
  "animation_action_id": 92
}
```

### 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"
  ]
}
JSON
)

SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  --request POST \
  --url https://api.wavespeed.ai/api/v3/meshy/v7.1/multi-image-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/meshy/v7.1/multi-image-to-3d)
- [API Documentation](https://wavespeed.ai/docs/docs-api/meshy/meshy-v7.1-multi-image-to-3d)
