Meshy 7.1 API, Meshy 7 API & Meshy 6 API: Pricing, Documentation
by Meshy
Meshy 3D API is a professional-grade 3D generation interface designed to programmatically transform text prompts and 2D images into high-quality, production-ready 3D assets. Known for delivering sculpting-level detail, the system utilizes advanced neural geometry reconstruction to produce clean mesh topology, sharper hard-surface details, and lifelike organic forms. It offers comprehensive features such as automated AI texturing with PBR maps, automatic rigging and animation, and a low-poly mode optimized for real-time game engines. Supporting various industry-standard formats like OBJ, FBX, and GLB, this API enables developers to scale 3D content creation for game development, AR/VR experiences, and high-fidelity 3D printing workflows.

Models Version
Get $5 Free Credit on First Payment
No strings attached — add funds and get $5 bonus instantly
Meshy 7.1 API Documentation
Generate a 3D model from a text prompt with Meshy 7.1. Returns a GLB. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the model from output.media_url. 3D generation typically takes a few minutes.
POST https://gateway.pixazo.ai/meshy-7-1/v1/text-to-3dAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to 3D - Meshy 7.1
Request Code
POST https://gateway.pixazo.ai/meshy-7-1/v1/text-to-3d
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "a weathered wooden treasure chest with iron bands",
"mode": "full",
"topology": "triangle",
"target_polycount": 30000
}import requests
url = "https://gateway.pixazo.ai/meshy-7-1/v1/text-to-3d"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "a weathered wooden treasure chest with iron bands",
"mode": "full",
"topology": "triangle",
"target_polycount": 30000
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/meshy-7-1/v1/text-to-3d", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "a weathered wooden treasure chest with iron bands",
"mode": "full",
"topology": "triangle",
"target_polycount": 30000
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/meshy-7-1/v1/text-to-3d' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "a weathered wooden treasure chest with iron bands", "mode": "full", "topology": "triangle", "target_polycount": 30000}'Output
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/meshy-7-1/v1/text-to-3d' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"prompt": "a weathered wooden treasure chest with iron bands", "mode": "full", "topology": "triangle", "target_polycount": 30000}'Callback Payload (success)
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-7-1",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.glb"
],
"media_type": "model/gltf-binary"
},
"created_at": "2026-09-22T11:56:21.804Z",
"completed_at": "2026-09-22T12:01:44.210Z"
}Failure callback shape
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "meshy-7-1",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | up to 600 characters | What the object is. Describe the object itself rather than a scene — there is no camera or background in a 3D model. |
mode | No | string | full | preview, full | Controls texturing, and therefore the price. full returns a textured model; preview returns untextured geometry only and costs less. This operation uses mode; the image operations use should_texture instead. |
model_type | No | string | standard | standard, lowpoly, smart-topology | Geometry style. lowpoly ignores the remesh controls; smart-topology produces cleaner edge flow and caps the polygon count at 15,000. |
enable_prompt_expansion | No | boolean | false | true, false | Let Meshy expand a short prompt into a fuller description before generating. |
seed | No | integer | — | any integer | Same inputs and seed usually reproduce the same model. |
topology | No | string | triangle | quad, triangle | Quad for smooth surfaces, triangle for detailed geometry. Ignored when model_type is lowpoly. |
target_polycount | No | integer | 30000 | 100–300000 | Target polygon count of the remeshed model. Ignored when model_type is lowpoly; smart-topology caps it at 15,000 and uses 4,000 when the field is omitted. |
should_remesh | No | boolean | true | true, false | When false, returns the raw triangular mesh without the remeshing pass. |
symmetry_mode | No | string | auto | off, auto, on | Force symmetry on or off, or let Meshy decide. |
pose_mode | No | string | — (no specific pose) | a-pose, t-pose, "" | Generate a character in a standard A-pose or T-pose, which is what most rigging tools expect. |
texture_prompt | No | string | — | up to 600 characters | Text guidance for the texturing pass. Only used on a textured request. |
texture_image_url | No | string | — | https URL, up to 20 MB | A 2D image that guides the texturing pass. Only used on a textured request. |
enable_safety_checker | No | boolean | true | true, false | Screen the input before generating. |
Good to know
- Exactly one model is generated per request. There is no batch option:
num_images,n,count,batch_sizeandnumber_of_imagesare rejected. should_texture,image_urlandimage_urlsbelong to the other operations and are rejected here.- Auto-rigging and animation (
enable_rigging,enable_animation) are not available on this API, andgeometry_resolutionis fixed atstandard. - Cost depends on whether the model is textured; the current rates are in the pricing panel on this page.
Example Request
{
"prompt": "a weathered wooden treasure chest with iron bands",
"mode": "full",
"topology": "triangle",
"target_polycount": 30000
}Example Response
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — prompt missing or over 600 characters, mode outside preview/full, an input belonging to another operation, or an unsupported option such as enable_rigging. Anything checkable from the request body alone. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Only what can be judged from the request body itself is rejected synchronously. Everything that needs an input to be fetched or the model to run is reported through the status endpoint instead, as status: "ERROR". Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
prompt missing, or longer than 600 characters | synchronous 400 |
should_texture, image_url or image_urls sent to this operation | synchronous 400 |
enable_rigging, enable_animation, or geometry_resolution other than standard | synchronous 400 |
| A prompt the safety checker rejects | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then download the model from output.media_url. 3D generation typically takes a few minutes, so poll every 10–15 seconds rather than continuously.
curl 'https://gateway.pixazo.ai/v2/requests/status/meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-7-1",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.glb"
],
"media_type": "model/gltf-binary"
},
"created_at": "2026-09-22T11:56:21.804Z",
"completed_at": "2026-09-22T12:01:44.210Z"
}Meshy also produces OBJ, FBX and USDZ variants, a preview thumbnail and separate texture files. This API returns the GLB only — it is the single self-contained file that carries mesh, materials and textures together, and it is what the console preview renders.
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | array | URL of the generated 3D model (GLB). |
| output.media_type | string | model/gltf-binary. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is FAILED/ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
How billing is measured
Billing is per generated model, and every request generates exactly one, so the amount held when the request is submitted is the amount charged on completion. The only thing that changes the amount is whether the model is textured — an untextured request costs less. It does not depend on the polygon count, the topology, or how many reference images you send. If the request fails, the hold is released in full.
Untextured is $0.84 and textured is $1.26.
Meshy 7.1 API Pricing
Textured is the default; an untextured request costs less. Polygon count, topology and the number of reference images do not change the price.
| Option | Price (USD) |
|---|---|
| Textured (default) | $1.26 |
| No texture | $0.84 |
Meshy 7.1 API Documentation
Turn a single reference image into a 3D model with Meshy 7.1. Returns a GLB. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the model from output.media_url. 3D generation typically takes a few minutes.
POST https://gateway.pixazo.ai/meshy-7-1/v1/image-to-3dAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Image to 3D - Meshy 7.1
Request Code
POST https://gateway.pixazo.ai/meshy-7-1/v1/image-to-3d
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg",
"should_texture": true,
"topology": "triangle",
"target_polycount": 30000
}import requests
url = "https://gateway.pixazo.ai/meshy-7-1/v1/image-to-3d"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg",
"should_texture": true,
"topology": "triangle",
"target_polycount": 30000
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/meshy-7-1/v1/image-to-3d", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg",
"should_texture": true,
"topology": "triangle",
"target_polycount": 30000
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/meshy-7-1/v1/image-to-3d' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg", "should_texture": true, "topology": "triangle", "target_polycount": 30000}'Output
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/meshy-7-1/v1/image-to-3d' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg", "should_texture": true, "topology": "triangle", "target_polycount": 30000}'Callback Payload (success)
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-7-1",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.glb"
],
"media_type": "model/gltf-binary"
},
"created_at": "2026-09-22T11:56:21.804Z",
"completed_at": "2026-09-22T12:01:44.210Z"
}Failure callback shape
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "meshy-7-1",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
image_url | Yes | string | — | https URL, up to 20 MB | The reference image: jpg, jpeg, png, avif or heif. A single object on a clean background reconstructs best. Must be publicly reachable; the gateway fetches it before generation. |
should_texture | No | boolean | true | true, false | Controls texturing, and therefore the price. false returns untextured geometry only and costs less. This operation uses should_texture; text to 3D uses mode instead. |
model_type | No | string | standard | standard, lowpoly, smart-topology | Geometry style. lowpoly ignores the remesh controls; smart-topology produces cleaner edge flow and caps the polygon count at 15,000. |
seed | No | integer | — | any integer | Same inputs and seed usually reproduce the same model. |
topology | No | string | triangle | quad, triangle | Quad for smooth surfaces, triangle for detailed geometry. Ignored when model_type is lowpoly. |
target_polycount | No | integer | 30000 | 100–300000 | Target polygon count of the remeshed model. Ignored when model_type is lowpoly; smart-topology caps it at 15,000 and uses 4,000 when the field is omitted. |
should_remesh | No | boolean | true | true, false | When false, returns the raw triangular mesh without the remeshing pass. |
symmetry_mode | No | string | auto | off, auto, on | Force symmetry on or off, or let Meshy decide. |
pose_mode | No | string | — (no specific pose) | a-pose, t-pose, "" | Generate a character in a standard A-pose or T-pose, which is what most rigging tools expect. |
texture_prompt | No | string | — | up to 600 characters | Text guidance for the texturing pass. Only used on a textured request. |
texture_image_url | No | string | — | https URL, up to 20 MB | A 2D image that guides the texturing pass. Only used on a textured request. |
enable_safety_checker | No | boolean | true | true, false | Screen the input before generating. |
Good to know
- Exactly one model is generated per request. There is no batch option:
num_images,n,count,batch_sizeandnumber_of_imagesare rejected. mode,promptandimage_urlsbelong to the other operations and are rejected here.- Auto-rigging and animation (
enable_rigging,enable_animation) are not available on this API, andgeometry_resolutionis fixed atstandard. - Cost depends on whether the model is textured; the current rates are in the pricing panel on this page.
Example Request
{
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg",
"should_texture": true,
"topology": "triangle",
"target_polycount": 30000
}Example Response
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — image_url missing, an input belonging to another operation, or an unsupported option such as enable_rigging. Anything checkable from the request body alone. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Only what can be judged from the request body itself is rejected synchronously. Everything that needs an input to be fetched or the model to run is reported through the status endpoint instead, as status: "ERROR". Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
image_url missing, or not a string | synchronous 400 |
mode, prompt or image_urls sent to this operation | synchronous 400 |
enable_rigging, enable_animation, or geometry_resolution other than standard | synchronous 400 |
| An image URL that is not https, not reachable, or not an image | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then download the model from output.media_url. 3D generation typically takes a few minutes, so poll every 10–15 seconds rather than continuously.
curl 'https://gateway.pixazo.ai/v2/requests/status/meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-7-1",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.glb"
],
"media_type": "model/gltf-binary"
},
"created_at": "2026-09-22T11:56:21.804Z",
"completed_at": "2026-09-22T12:01:44.210Z"
}Meshy also produces OBJ, FBX and USDZ variants, a preview thumbnail and separate texture files. This API returns the GLB only — it is the single self-contained file that carries mesh, materials and textures together, and it is what the console preview renders.
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | array | URL of the generated 3D model (GLB). |
| output.media_type | string | model/gltf-binary. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is FAILED/ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
How billing is measured
Billing is per generated model, and every request generates exactly one, so the amount held when the request is submitted is the amount charged on completion. The only thing that changes the amount is whether the model is textured — an untextured request costs less. It does not depend on the polygon count, the topology, or how many reference images you send. If the request fails, the hold is released in full.
Untextured is $0.84 and textured is $1.26.
Meshy 7.1 API Pricing
Textured is the default; an untextured request costs less. Polygon count, topology and the number of reference images do not change the price.
| Option | Price (USD) |
|---|---|
| Textured (default) | $1.26 |
| No texture | $0.84 |
Meshy 7.1 API Documentation
Build one 3D model from up to four photographs of the same object taken from different angles, with Meshy 7.1. More angles give the model more to work with than a single view can. Returns a GLB. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the model from output.media_url. 3D generation typically takes a few minutes.
POST https://gateway.pixazo.ai/meshy-7-1/v1/multi-image-to-3dAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Multi Image to 3D - Meshy 7.1
Request Code
POST https://gateway.pixazo.ai/meshy-7-1/v1/multi-image-to-3d
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png"
],
"should_texture": true
}import requests
url = "https://gateway.pixazo.ai/meshy-7-1/v1/multi-image-to-3d"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png"
],
"should_texture": true
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/meshy-7-1/v1/multi-image-to-3d", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png"
],
"should_texture": true
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/meshy-7-1/v1/multi-image-to-3d' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"image_urls": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png", "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png"], "should_texture": true}'Output
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/meshy-7-1/v1/multi-image-to-3d' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"image_urls": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png", "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png"], "should_texture": true}'Callback Payload (success)
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-7-1",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.glb"
],
"media_type": "model/gltf-binary"
},
"created_at": "2026-09-22T11:56:21.804Z",
"completed_at": "2026-09-22T12:01:44.210Z"
}Failure callback shape
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "meshy-7-1",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
image_urls | Yes | array of strings | — | 1–4 https URLs, each up to 20 MB | Images of the same object from different angles — not different objects, and not a sequence. jpg, jpeg, png, avif or heif. Each must be publicly reachable. |
should_texture | No | boolean | true | true, false | Controls texturing, and therefore the price. false returns untextured geometry only and costs less. This operation uses should_texture; text to 3D uses mode instead. |
topology | No | string | triangle | quad, triangle | Quad for smooth surfaces, triangle for detailed geometry. Ignored when model_type is lowpoly. |
target_polycount | No | integer | 30000 | 100–300000 | Target polygon count of the remeshed model. Ignored when model_type is lowpoly; smart-topology caps it at 15,000 and uses 4,000 when the field is omitted. |
should_remesh | No | boolean | true | true, false | When false, returns the raw triangular mesh without the remeshing pass. |
symmetry_mode | No | string | auto | off, auto, on | Force symmetry on or off, or let Meshy decide. |
pose_mode | No | string | — (no specific pose) | a-pose, t-pose, "" | Generate a character in a standard A-pose or T-pose, which is what most rigging tools expect. |
texture_prompt | No | string | — | up to 600 characters | Text guidance for the texturing pass. Only used on a textured request. |
texture_image_url | No | string | — | https URL, up to 20 MB | A 2D image that guides the texturing pass. Only used on a textured request. |
enable_safety_checker | No | boolean | true | true, false | Screen the input before generating. |
Good to know
- Exactly one model is generated per request. There is no batch option:
num_images,n,count,batch_sizeandnumber_of_imagesare rejected. mode,prompt,image_url,model_typeandseedare not available on this operation and are rejected.- Auto-rigging and animation (
enable_rigging,enable_animation) are not available on this API, andgeometry_resolutionis fixed atstandard. - Cost depends on whether the model is textured; the current rates are in the pricing panel on this page.
Example Request
{
"image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png"
],
"should_texture": true
}Example Response
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — image_urls missing, empty or longer than 4, an input belonging to another operation, or an unsupported option such as enable_rigging. Anything checkable from the request body alone. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Only what can be judged from the request body itself is rejected synchronously. Everything that needs an input to be fetched or the model to run is reported through the status endpoint instead, as status: "ERROR". Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
image_urls missing, empty, or more than 4 entries | synchronous 400 |
mode, prompt, image_url, model_type or seed sent to this operation | synchronous 400 |
enable_rigging, enable_animation, or geometry_resolution other than standard | synchronous 400 |
| An image URL that is not https, not reachable, or not an image | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then download the model from output.media_url. 3D generation typically takes a few minutes, so poll every 10–15 seconds rather than continuously.
curl 'https://gateway.pixazo.ai/v2/requests/status/meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "meshy-7-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-7-1",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.glb"
],
"media_type": "model/gltf-binary"
},
"created_at": "2026-09-22T11:56:21.804Z",
"completed_at": "2026-09-22T12:01:44.210Z"
}Meshy also produces OBJ, FBX and USDZ variants, a preview thumbnail and separate texture files. This API returns the GLB only — it is the single self-contained file that carries mesh, materials and textures together, and it is what the console preview renders.
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | array | URL of the generated 3D model (GLB). |
| output.media_type | string | model/gltf-binary. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is FAILED/ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
How billing is measured
Billing is per generated model, and every request generates exactly one, so the amount held when the request is submitted is the amount charged on completion. The only thing that changes the amount is whether the model is textured — an untextured request costs less. It does not depend on the polygon count, the topology, or how many reference images you send. If the request fails, the hold is released in full.
Untextured is $0.84 and textured is $1.26.
Meshy 7.1 API Pricing
Textured is the default; an untextured request costs less. Polygon count, topology and the number of reference images do not change the price.
| Option | Price (USD) |
|---|---|
| Textured (default) | $1.26 |
| No texture | $0.84 |
Meshy 7 API Documentation
Generate a textured 3D model in GLB format from a single image with Meshy 7. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the model.
POST https://gateway.pixazo.ai/meshy-7/v1/image-to-3dAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Image to 3D - Meshy 7
Request Code
POST https://gateway.pixazo.ai/meshy-7/v1/image-to-3d
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/single.png",
"topology": "triangle",
"target_polycount": 30000,
"symmetry_mode": "auto",
"should_remesh": true,
"should_texture": true
}import requests
url = "https://gateway.pixazo.ai/meshy-7/v1/image-to-3d"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/single.png",
"topology": "triangle",
"target_polycount": 30000,
"symmetry_mode": "auto",
"should_remesh": true,
"should_texture": true
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/meshy-7/v1/image-to-3d", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/single.png",
"topology": "triangle",
"target_polycount": 30000,
"symmetry_mode": "auto",
"should_remesh": true,
"should_texture": true
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/meshy-7/v1/image-to-3d' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/single.png", "topology": "triangle", "target_polycount": 30000, "symmetry_mode": "auto", "should_remesh": true, "should_texture": true}'Output
{
"request_id": "meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. 3D generation regularly runs for several minutes, so a Webhook is usually the better fit here.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/meshy-7/v1/image-to-3d' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/single.png", "topology": "triangle", "target_polycount": 30000, "symmetry_mode": "auto", "should_remesh": true, "should_texture": true}'Callback Payload (success)
{
"request_id": "meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-7",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.glb"
],
"media_type": "model/gltf-binary"
},
"created_at": "2026-08-17T09:14:16.102Z",
"completed_at": "2026-08-17T09:26:41.870Z"
}Failure callback shape
{
"request_id": "meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "meshy-7",
"error": "Description of the failure"
}Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
image_url | Yes | string | — | Image URL or base64 data URI | Source image for the 3D model. Accepts .jpg, .jpeg and .png; AVIF and HEIF are converted automatically. |
model_type | No | string | standard | standard, lowpoly | Mesh style. lowpoly produces cleaner, lower-polygon geometry — and when set, Meshy ignores topology, target_polycount and should_remesh. |
topology | No | string | triangle | quad, triangle | Mesh topology. quad suits smooth surfaces, triangle detailed geometry. Ignored when should_remesh is false. |
target_polycount | No | integer | 30000 | 100–300000 | Target polygon count of the generated mesh. Ignored when should_remesh is false. |
symmetry_mode | No | string | auto | off, auto, on | Symmetry behaviour. off disables it, auto decides per object, on enforces it. |
should_remesh | No | boolean | true | true, false | Run the remesh phase. When false the raw triangular mesh is returned and both topology and target_polycount are ignored. |
should_texture | No | boolean | true | true, false | Generate textures. Affects the price — see Pricing. Setting false returns an untextured mesh and costs less. |
enable_pbr | No | boolean | false | true, false | Also generate PBR maps (metallic, roughness, normal) alongside base colour. Requires should_texture. Does not affect the price. |
pose_mode | No | string | "" | a-pose, t-pose, "" | Force the generated character into an A-pose or T-pose. Empty string applies no specific pose. |
is_a_t_pose | No | boolean | false | true, false | Deprecated — use pose_mode instead. Treats the input as already in T-pose. |
texture_prompt | No | string | — | Up to 600 characters | Text prompt steering the texturing pass. Requires should_texture. Longer values are rejected with 400. |
texture_image_url | No | string | — | Image URL | 2D image steering the texturing pass. Requires should_texture. |
enable_rigging | No | boolean | false | true, false | Auto-rig the result as a humanoid character, including basic walk and run animations. Best on humanoid subjects. Adds $0.20 — see Pricing. |
rigging_height_meters | No | number | 1.7 | 0.1–10 metres | Approximate character height. Only read when enable_rigging is true. |
enable_animation | No | boolean | false | true, false | Apply an animation preset. Requires enable_rigging — set on its own it has no effect and is not billed. Adds $0.12. |
animation_action_id | No | integer | 92 | 0–696 | Meshy animation preset (0 is Idle). Only read when enable_animation is true; a value outside the range is rejected with 422. |
enable_safety_checker | No | boolean | true | true, false | Safety-check the input images before processing. |
ultra_mode | No | boolean | false | true, false | Higher-fidelity geometry with finer surface detail. Affects the price — see Pricing. |
Notes
should_texture and ultra_mode are the two price axes on this operation; enable_rigging and enable_animation add fixed amounts on top. enable_animation requires enable_rigging — sent alone it is ignored and not billed. Setting model_type to lowpoly silently overrides topology, target_polycount and should_remesh.
Example Request
{
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/single.png",
"topology": "triangle",
"target_polycount": 30000,
"symmetry_mode": "auto",
"should_remesh": true,
"should_texture": true
}Example Response
{
"request_id": "meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks. |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — a missing or out-of-range parameter. The message names the field. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 422 | Unprocessable entity — the provider rejected a value, e.g. an animation_action_id outside 0–696. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Retrieving Results
Poll the status endpoint with the request_id until status is COMPLETED (or ERROR), then download output.media_url. A 3D generation typically takes a few minutes, and considerably longer with rigging or animation enabled.
curl 'https://gateway.pixazo.ai/v2/requests/status/meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-7",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.glb"
],
"media_type": "model/gltf-binary"
},
"created_at": "2026-08-17T09:14:16.102Z",
"completed_at": "2026-08-17T09:26:41.870Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | array | One URL, pointing at the generated .glb model. |
| output.media_type | string | model/gltf-binary. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
Meshy also produces OBJ, FBX and USDZ variants, a preview thumbnail and separate texture files. This API returns the GLB only — it is the single self-contained file that carries mesh, materials and textures together, and it is what the console preview renders.
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Pricing
Billed per generation. The base rate depends on the options below; add-ons are then added on top.
| Options | Result | Price |
|---|---|---|
should_texture: false | Untextured mesh | $0.80 |
| default | Textured model | $1.20 |
ultra_mode: true | Ultra-quality textured model | $1.40 |
Add-ons, charged on top of the base rate: enable_rigging +$0.20, enable_animation +$0.12. Animation requires rigging, so the two together add $0.32.
Failed requests are not billed.
Meshy 7 API Pricing
Base rate depends on texturing and ultra mode; auto-rigging adds $0.20 and animation adds $0.12.
| Option | Price (USD) |
|---|---|
| Textured (default) | $1.20 |
| No texture | $0.80 |
| Ultra mode | $1.40 |
| Auto-rigging add-on (additional) | $0.20 |
| Animation add-on (additional) | $0.12 |
Meshy 7 API Documentation
Generate a textured 3D model in GLB format from up to four images of the same object photographed from different angles, with Meshy 7. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the model.
POST https://gateway.pixazo.ai/meshy-7/v1/multi-image-to-3dAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Multi Image to 3D - Meshy 7
Request Code
POST https://gateway.pixazo.ai/meshy-7/v1/multi-image-to-3d
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-3.png"
],
"topology": "triangle",
"target_polycount": 30000,
"symmetry_mode": "auto",
"should_remesh": true,
"should_texture": true
}import requests
url = "https://gateway.pixazo.ai/meshy-7/v1/multi-image-to-3d"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-3.png"
],
"topology": "triangle",
"target_polycount": 30000,
"symmetry_mode": "auto",
"should_remesh": true,
"should_texture": true
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/meshy-7/v1/multi-image-to-3d", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-3.png"
],
"topology": "triangle",
"target_polycount": 30000,
"symmetry_mode": "auto",
"should_remesh": true,
"should_texture": true
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/meshy-7/v1/multi-image-to-3d' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"image_urls": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png", "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png", "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-3.png"], "topology": "triangle", "target_polycount": 30000, "symmetry_mode": "auto", "should_remesh": true, "should_texture": true}'Output
{
"request_id": "meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. 3D generation regularly runs for several minutes, so a Webhook is usually the better fit here.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/meshy-7/v1/multi-image-to-3d' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"image_urls": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png", "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png", "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-3.png"], "topology": "triangle", "target_polycount": 30000, "symmetry_mode": "auto", "should_remesh": true, "should_texture": true}'Callback Payload (success)
{
"request_id": "meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-7",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.glb"
],
"media_type": "model/gltf-binary"
},
"created_at": "2026-08-17T09:14:16.102Z",
"completed_at": "2026-08-17T09:26:41.870Z"
}Failure callback shape
{
"request_id": "meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "meshy-7",
"error": "Description of the failure"
}Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
image_urls | Yes | array of string | — | 1–4 image URLs | Between one and four images of the same object from different angles. Accepts .jpg, .jpeg and .png; AVIF and HEIF are converted automatically. Sending more than four is rejected with 400, not silently truncated. |
topology | No | string | triangle | quad, triangle | Mesh topology. quad suits smooth surfaces, triangle detailed geometry. Ignored when should_remesh is false. |
target_polycount | No | integer | 30000 | 100–300000 | Target polygon count of the generated mesh. Ignored when should_remesh is false. |
symmetry_mode | No | string | auto | off, auto, on | Symmetry behaviour. off disables it, auto decides per object, on enforces it. |
should_remesh | No | boolean | true | true, false | Run the remesh phase. When false the raw triangular mesh is returned and both topology and target_polycount are ignored. |
should_texture | No | boolean | true | true, false | Generate textures. Affects the price — see Pricing. On this operation an untextured model is billed at the same rate as a textured one. |
enable_pbr | No | boolean | false | true, false | Also generate PBR maps (metallic, roughness, normal) alongside base colour. Requires should_texture. Does not affect the price. |
pose_mode | No | string | "" | a-pose, t-pose, "" | Force the generated character into an A-pose or T-pose. Empty string applies no specific pose. |
is_a_t_pose | No | boolean | false | true, false | Deprecated — use pose_mode instead. Treats the input as already in T-pose. |
texture_prompt | No | string | — | Up to 600 characters | Text prompt steering the texturing pass. Requires should_texture. Longer values are rejected with 400. |
texture_image_url | No | string | — | Image URL | 2D image steering the texturing pass. Requires should_texture. |
enable_rigging | No | boolean | false | true, false | Auto-rig the result as a humanoid character, including basic walk and run animations. Best on humanoid subjects. Adds $0.20 — see Pricing. |
rigging_height_meters | No | number | 1.7 | 0.1–10 metres | Approximate character height. Only read when enable_rigging is true. |
enable_animation | No | boolean | false | true, false | Apply an animation preset. Requires enable_rigging — set on its own it has no effect and is not billed. Adds $0.12. |
animation_action_id | No | integer | 92 | 0–696 | Meshy animation preset (0 is Idle). Only read when enable_animation is true; a value outside the range is rejected with 422. |
enable_safety_checker | No | boolean | true | true, false | Safety-check the input images before processing. |
ultra_mode | No | boolean | false | true, false | Higher-fidelity geometry with finer surface detail. Affects the price — see Pricing. Charged only when you send it explicitly; omit it and the standard rate applies. |
Notes
model_type is not available on this operation — it exists only on the single-image /image-to-3d endpoint, and sending it here has no effect and does not change the price. enable_animation requires enable_rigging; sent alone it is ignored and not billed. All input images must show the same object, or the reconstruction degrades badly.
Example Request
{
"image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-1.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-2.png",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/meshy-7/multi-3.png"
],
"topology": "triangle",
"target_polycount": 30000,
"symmetry_mode": "auto",
"should_remesh": true,
"should_texture": true
}Example Response
{
"request_id": "meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks. |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — a missing or out-of-range parameter. The message names the field. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 422 | Unprocessable entity — the provider rejected a value, e.g. an animation_action_id outside 0–696. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Retrieving Results
Poll the status endpoint with the request_id until status is COMPLETED (or ERROR), then download output.media_url. A 3D generation typically takes a few minutes, and considerably longer with rigging or animation enabled.
curl 'https://gateway.pixazo.ai/v2/requests/status/meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "meshy-7_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-7",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.glb"
],
"media_type": "model/gltf-binary"
},
"created_at": "2026-08-17T09:14:16.102Z",
"completed_at": "2026-08-17T09:26:41.870Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | array | One URL, pointing at the generated .glb model. |
| output.media_type | string | model/gltf-binary. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
Meshy also produces OBJ, FBX and USDZ variants, a preview thumbnail and separate texture files. This API returns the GLB only — it is the single self-contained file that carries mesh, materials and textures together, and it is what the console preview renders.
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Pricing
Billed per generation. The base rate depends on the options below; add-ons are then added on top.
| Options | Result | Price |
|---|---|---|
| default | Textured model | $1.20 |
should_texture: false | Untextured mesh — billed at the textured rate | $1.20 |
ultra_mode: true | Ultra-quality textured model | $1.40 |
Add-ons, charged on top of the base rate: enable_rigging +$0.20, enable_animation +$0.12. Animation requires rigging, so the two together add $0.32.
Failed requests are not billed.
Meshy 7 API Pricing
Base rate depends on ultra mode; auto-rigging adds $0.20 and animation adds $0.12.
| Option | Price (USD) |
|---|---|
| Textured (default) | $1.20 |
| Ultra mode | $1.40 |
| Auto-rigging add-on (additional) | $0.20 |
| Animation add-on (additional) | $0.12 |
Meshy 6 API Documentation
https://gateway.pixazo.ai/meshy-6-text-to-3d/v1/meshy-6-text-to-3d-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Meshy 6 (Text to 3D) generate request - Meshy 6 (Text to 3D)
Request Code
POST https://gateway.pixazo.ai/meshy-6-text-to-3d/v1/meshy-6-text-to-3d-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A rustic antique wooden treasure chest with iron bands and ornate metalwork",
"mode": "full",
"topology": "triangle",
"target_polycount": 30000,
"should_remesh": true,
"symmetry_mode": "auto",
"rigging_height_meters": 1.7,
"animation_action_id": 92,
"enable_safety_checker": true
}
import requests
url = "https://gateway.pixazo.ai/meshy-6-text-to-3d/v1/meshy-6-text-to-3d-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A rustic antique wooden treasure chest with iron bands and ornate metalwork",
"mode": "full",
"topology": "triangle",
"target_polycount": 30000,
"should_remesh": true,
"symmetry_mode": "auto",
"rigging_height_meters": 1.7,
"animation_action_id": 92,
"enable_safety_checker": true
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const url = "https://gateway.pixazo.ai/meshy-6-text-to-3d/v1/meshy-6-text-to-3d-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
};
const data = {
prompt: "A rustic antique wooden treasure chest with iron bands and ornate metalwork",
mode: "full",
topology: "triangle",
target_polycount: 30000,
should_remesh: true,
symmetry_mode: "auto",
rigging_height_meters: 1.7,
animation_action_id: 92,
enable_safety_checker: true
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/meshy-6-text-to-3d/v1/meshy-6-text-to-3d-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "A rustic antique wooden treasure chest with iron bands and ornate metalwork",
"mode": "full",
"topology": "triangle",
"target_polycount": 30000,
"should_remesh": true,
"symmetry_mode": "auto",
"rigging_height_meters": 1.7,
"animation_action_id": 92,
"enable_safety_checker": true
}'
Output
{
"request_id": "meshy-6-text-to-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Parameters - Meshy 6 (Text to 3D) generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | Max 600 characters | Description of the 3D object. Maximum 600 characters. |
| mode | No | enum | "full" | preview, full | Generation mode. "preview" returns untextured geometry only; "full" runs preview + refine and returns a fully textured model (required for the texture, PBR and rigging options). |
| seed | No | integer | — | — | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
| model_type | No | enum | "standard" | standard, lowpoly | Type of 3D mesh generation. "standard" produces a regular high-detail mesh; "lowpoly" produces a low-poly mesh optimized for cleaner geometry with fewer polygons. |
| topology | No | enum | "triangle" | quad, triangle | Mesh topology type. Quad for smooth surfaces, triangle for detailed geometry. |
| target_polycount | No | integer | 30000 | 100–300000 | The desired number of polygons in the generated 3D model. Higher values give a more detailed, heavier mesh; lower values give a simpler, lighter one. |
| should_remesh | No | boolean | true | true, false | Rebuilds the model's surface grid for cleaner geometry. When off, returns the raw, unoptimized triangular mesh. |
| symmetry_mode | No | enum | "auto" | off, auto, on | Symmetry enforcement mode. "off" disables symmetry, "auto" decides automatically, "on" enforces symmetry. |
| enable_pbr | No | boolean | false | true, false | Generates realistic surface materials (PBR: metallic, roughness, normal maps) so the model reacts properly to light. Only available in full mode. |
| pose_mode | No | enum | "" | a-pose, t-pose, "" (empty) | Character pose for rigging. "a-pose" generates an A-pose, "t-pose" a T-pose; empty string for no specific pose. |
| enable_prompt_expansion | No | boolean | false | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. |
| texture_prompt | No | string | — | Max 600 characters | Additional prompt to guide texturing. Only used in full mode. |
| texture_image_url | No | string | — | — | URL to a 2D image used to guide texturing. Only used in full mode. |
| enable_rigging | No | boolean | false | true, false | Auto-rig the generated model as a humanoid character, including basic walking and running animations. |
| rigging_height_meters | No | float | 1.7 | — | Approximate height of the rigged character in meters. Only used when enable_rigging is true. |
| enable_animation | No | boolean | false | true, false | Apply a predefined animation preset. Requires enable_rigging to be true. |
| animation_action_id | No | integer | 92 | 0–696 | Animation preset ID from Meshy's library. Only used when enable_animation is true. See https://docs.meshy.ai/en/api/animation-library. |
| enable_safety_checker | No | boolean | true | true, false | Turns on automatic filtering of unsafe or explicit (NSFW) content. Leave enabled unless you have a specific reason to disable it. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP | Optional texture-guidance image (1024px+). |
Minimum Request
{
"prompt": "A rustic antique wooden treasure chest with iron bands and ornate metalwork"
}
Full Request (all options)
{
"prompt": "A rustic antique wooden treasure chest with iron bands and ornate metalwork",
"mode": "full",
"seed": 12345,
"topology": "triangle",
"target_polycount": 30000,
"should_remesh": true,
"symmetry_mode": "auto",
"enable_pbr": true,
"pose_mode": "t-pose",
"enable_prompt_expansion": false,
"texture_prompt": "Ancient wood with weathered patina and brass fittings",
"texture_image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"enable_rigging": true,
"rigging_height_meters": 1.7,
"enable_animation": true,
"animation_action_id": 92,
"enable_safety_checker": true
}
Response
{
"request_id": "meshy-6-text-to-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-6-text-to-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Response Fields - Meshy 6 (Text to 3D) generate request
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier to track the job status |
| status | string | Current status of the job (QUEUED, PROCESSING, COMPLETED, FAILED, ERROR) |
| polling_url | string | URL to use for checking the status of the generated model |
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for Meshy 6 (Text to 3D) generate request.
| Code | Meaning |
|---|---|
| 200 | Success |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Common Error Responses
400 Validation Error
{
"error": "Invalid parameter: mode must be one of 'preview', 'full'"
}
404 Not Found
{
"error": "Invalid request_id: meshy-6-text-to-3d_invalid_id"
}
Status Workflow
Status values and lifecycle for Meshy 6 (Text to 3D) requests.
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
Submitted → QUEUED → PROCESSING → COMPLETED/FAILED/ERROR
Typical Workflow
- Submit request to /meshy-6-text-to-3d-request
- Receive request_id in response
- Poll /v2/requests/status/{request_id} every 2-3 seconds
- When status=COMPLETED, use model_glb and other URLs from response
- Handle FAILED or ERROR states with appropriate retry or error handling
Meshy 6 (Text to 3D) check status - Meshy 6 (Text to 3D)
Request Code
POST https://gateway.pixazo.ai/meshy-6-text-to-3d/v1/meshy-6-text-to-3d-request-result
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"request_id": "meshy-6-text-to-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
import requests
url = "https://gateway.pixazo.ai/meshy-6-text-to-3d/v1/meshy-6-text-to-3d-request-result"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"request_id": "meshy-6-text-to-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const url = "https://gateway.pixazo.ai/meshy-6-text-to-3d/v1/meshy-6-text-to-3d-request-result";
const headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
};
const data = {
request_id: "meshy-6-text-to-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/meshy-6-text-to-3d/v1/meshy-6-text-to-3d-request-result" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"request_id": "meshy-6-text-to-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}'
Output
{
"model_glb": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.glb",
"thumbnail": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/thumbnail.jpg",
"model_urls": {
"glb": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.glb",
"fbx": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.fbx",
"obj": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.obj",
"usdz": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.usdz",
"blend": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.blend",
"stl": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.stl"
},
"texture_urls": {
"base_color": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/base_color.jpg",
"metallic": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/metallic.jpg",
"roughness": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/roughness.jpg",
"normal": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/normal.jpg"
},
"seed": 12345,
"prompt": "A rustic antique wooden treasure chest with iron bands and ornate metalwork",
"actual_prompt": "A rustic antique wooden treasure chest with iron bands and ornate metalwork, weathered with age, displaying intricate carvings and tarnished brass fittings"
}
Request Parameters - Meshy 6 (Text to 3D) check status
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| request_id | Yes | string | — | — | Unique identifier returned from the initial request submission |
Minimum Request
{
"request_id": "meshy-6-text-to-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Full Request (all options)
{
"request_id": "meshy-6-text-to-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Response
{
"request_id": "meshy-6-text-to-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-6-text-to-3d",
"error": null,
"output": {
"model_glb": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.glb",
"thumbnail": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/thumbnail.jpg",
"model_urls": {
"glb": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.glb",
"fbx": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.fbx",
"obj": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.obj",
"usdz": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.usdz",
"blend": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.blend",
"stl": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/output.stl"
},
"texture_urls": {
"base_color": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/base_color.jpg",
"metallic": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/metallic.jpg",
"roughness": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/roughness.jpg",
"normal": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/normal.jpg"
},
"seed": 12345,
"prompt": "A rustic antique wooden treasure chest with iron bands and ornate metalwork",
"actual_prompt": "A rustic antique wooden treasure chest with iron bands and ornate metalwork, weathered with age, displaying intricate carvings and tarnished brass fittings"
},
"rigged_character_glb": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/rigged_character.glb",
"rigged_character_fbx": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/rigged_character.fbx",
"basic_animations": [
{
"name": "idle",
"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-text-to-3d_019dxxxx/animation_idle.glb"
}
],
"rig_task_id": "rig_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields - Meshy 6 (Text to 3D) check status
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier of the request |
| status | string | Current status of the job (QUEUED, PROCESSING, COMPLETED, FAILED, ERROR) |
| model_id | string | ID of the model used for generation |
| error | null|string | Error description if status is FAILED, otherwise null |
| output.model_glb | string | URL to the GLB model file |
| output.thumbnail | string | URL to the model thumbnail image |
| output.model_urls | object | Dictionary of model file formats and their URLs (glb, fbx, obj, usdz, blend, stl) |
| output.texture_urls | object | Dictionary of texture map URLs (base_color, metallic, roughness, normal) |
| output.seed | integer | Seed used for the generation |
| output.prompt | string | Original text prompt |
| output.actual_prompt | string | Prompt after LLM expansion (if enable_prompt_expansion was used) |
| rigged_character_glb | string | URL to the rigged character GLB file (if enable_rigging was true) |
| rigged_character_fbx | string | URL to the rigged character FBX file (if enable_rigging was true) |
| basic_animations | array | List of animation files with name and URL |
| rig_task_id | string | Internal identifier for the rigging task (if enable_rigging was true) |
| created_at | string | ISO timestamp when the request was created |
| updated_at | string | ISO timestamp when the request was last updated |
| completed_at | string | ISO timestamp when the request was completed |
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for Meshy 6 (Text to 3D) check status.
| Code | Meaning |
|---|---|
| 200 | Success |
| 400 | Bad Request (invalid request_id) |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found (request_id not found) |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Notes & Tips
- Poll the status endpoint every 2–3 seconds until status is COMPLETED, FAILED, or ERROR.
- Use enable_prompt_expansion to enhance vague prompts with semantic detail.
- For character models, combine enable_rigging, pose_mode, and enable_animation for ready-to-animate assets.
- Use texture_image_url for precise texture control when text prompts are insufficient.
- Set target_polycount appropriately: lower values (5k–15k) for web/mobile, higher (30k–100k) for high-end rendering.
- Always validate actual_prompt in COMPLETED responses to confirm prompt expansion behavior.
- Implement retry logic for transient ERROR or FAILED states.
- Predictive generation time: 15–60 seconds for preview mode, 30–120 seconds for full mode.
- Texture guidance works best with high-resolution source images (1024x1024+).
- Enable safety_checker is recommended for public applications to prevent inappropriate generation.
Meshy 6 API Pricing
Meshy 6 API Documentation
https://gateway.pixazo.ai/meshy-6-i2-3d/v1/meshy-6-i2-3d-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Meshy 6 i2-3d generate request - Meshy 6 i2-3d
Request Code
POST https://gateway.pixazo.ai/meshy-6-i2-3d/v1/meshy-6-i2-3d-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png"
}
import requests
url = "https://gateway.pixazo.ai/meshy-6-i2-3d/v1/meshy-6-i2-3d-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/meshy-6-i2-3d/v1/meshy-6-i2-3d-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
};
const data = {
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
curl -X POST "https://gateway.pixazo.ai/meshy-6-i2-3d/v1/meshy-6-i2-3d-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png"
}'
Output
{
"request_id": "meshy-6-i2-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-6-i2-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "meshy-6-i2-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-6-i2-3d",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-i2-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.glb"
],
"media_type": "model/glb"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "meshy-6-i2-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "meshy-6-i2-3d",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - Meshy 6 i2-3d generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| image_url | Yes | string | — | — | URL of the input 2D image to convert into a 3D model. Supports .jpg, .jpeg and .png (also AVIF/HEIF); a base64 data URI is also accepted. |
| model_type | No | enum | "standard" | standard, lowpoly | Type of 3D mesh generation. "standard" produces a regular high-detail mesh; "lowpoly" produces a low-poly mesh optimized for cleaner geometry with fewer polygons. |
| topology | No | enum | "triangle" | quad, triangle | Mesh topology type. Quad for smooth surfaces, triangle for detailed geometry. |
| target_polycount | No | integer | 30000 | 100–300000 | The desired number of polygons in the generated 3D model. Higher values give a more detailed, heavier mesh; lower values give a simpler, lighter one. |
| symmetry_mode | No | enum | "auto" | off, auto, on | Symmetry enforcement mode. "off" disables symmetry, "auto" decides automatically, "on" enforces symmetry. |
| should_remesh | No | boolean | true | true, false | Rebuilds the model's surface grid for cleaner geometry. When off, returns the raw, unoptimized triangular mesh. |
| should_texture | No | boolean | true | true, false | Generates a texture map for the 3D model. When off, returns untextured geometry only. |
| enable_pbr | No | boolean | false | true, false | Generates realistic surface materials (PBR: metallic, roughness, normal maps) in addition to the base colour, so the model reacts properly to light. |
| pose_mode | No | enum | "" | a-pose, t-pose, "" (empty) | Character pose for rigging. "a-pose" generates an A-pose, "t-pose" a T-pose; empty string for no specific pose. |
| texture_prompt | No | string | — | Max 600 characters | Additional text prompt used to guide the texturing process. |
| texture_image_url | No | string | — | — | URL to a 2D image used to guide the texturing process. |
| enable_rigging | No | boolean | false | true, false | Auto-rig the generated model as a humanoid character, including basic walking and running animations. |
| rigging_height_meters | No | float | 1.7 | — | Approximate height of the rigged character in meters. Only used when enable_rigging is true. |
| enable_animation | No | boolean | false | true, false | Apply a predefined animation preset. Requires enable_rigging to be true. |
| animation_action_id | No | integer | 92 | 0–696 | Animation preset ID from Meshy's library. Only used when enable_animation is true. See https://docs.meshy.ai/en/api/animation-library. |
| enable_safety_checker | No | boolean | true | true, false | Turns on automatic filtering of unsafe or explicit (NSFW) content. Leave enabled unless you have a specific reason to disable it. |
Minimum Request
{
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png"
}
Full Request (all options)
{
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png",
"topology": "triangle",
"target_polycount": 30000,
"symmetry_mode": "auto",
"should_remesh": true,
"should_texture": true,
"enable_safety_checker": true
}
Response
{
"request_id": "meshy-6-i2-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/meshy-6-i2-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for Meshy 6 i2-3d generate request.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'meshy-6-i2-3d' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "meshy-6-i2-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "meshy-6-i2-3d",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/meshy-6-i2-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "meshy-6-i2-3d_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "meshy-6-i2-3d",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/meshy-6-i2-3d_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Meshy 6 API Pricing
⚡ Performance
Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).
〰 Uptime
Percent of generations that succeeded over the selected period, per model version.