API Free WeekHundreds of APIs are free to call this week.Browse free APIs
API reference · Meshy

meshy/7.1/text-to-3d

Integrate this model through SandBase's unified API, with production-ready schemas and examples.

IMAGEAsyncOpen model
Production endpoint

Send your first request

OpenAI-compatible endpoint with unified authentication and usage tracking.

POSThttps://api.sandbase.ai/v1/run
Model IDmeshy/7.1/text-to-3d
01

Input Schema

13 parameters · 1 required · 12 optional

ParameterTypeRequiredDescription
promptstringRequiredDescribe what kind of object the 3D model is. Maximum 600 characters. · Max length: 600
seedintegerOptionalSeed for reproducible results.
topologystringOptionalquad for smooth surfaces, triangle for detail. · Options: quad, triangle · Default: "triangle"
quadtriangle
pose_modestringOptionala-pose, t-pose or empty for none. · Options: a-pose, t-pose, · Default: ""
a-poset-pose
enable_pbrbooleanOptionalGenerate PBR maps (metallic, roughness, normal). · Default: false
model_typestringOptionalstandard, lowpoly or smart-topology. · Options: standard, lowpoly, smart-topology · Default: "standard"
standardlowpolysmart-topology
symmetry_modestringOptionaloff / auto / on. · Options: off, auto, on · Default: "auto"
offautoon
texture_imagestringOptionalImage URL to guide texturing.
enable_riggingbooleanOptionalRig the model as a humanoid character (+$0.20). · Default: false
texture_promptstringOptionalText prompt to guide texturing. · Max length: 600
enable_animationbooleanOptionalApply an animation preset; requires enable_rigging (+$0.12). · Default: false
target_polycountintegerOptionalTarget polygon count (100–300,000). · Min: 100 · Max: 300000 · Default: 30000
geometry_resolutionstringOptionalGeometry resolution. · Options: standard, 2k, 4k · Default: "standard"
standard2k4k
02

Output Schema

FieldTypeDescription
idstringUnique identifier for the generation task
statusstringTask status: pending, running, completed, failed, timeout
modelstringModel used for the generation
outputsarrayArray of output items
outputs[].urlstringURL of the generated artifact
outputs[].content_typestringMIME type (e.g. image/png, video/mp4)
errorobject | nullError details if failed, null on success
error.typestringMachine-readable error type code
error.messagestringHuman-readable error description

Async Workflow

This model uses asynchronous execution. Submit a request and poll for the result.

  1. Submit — POST to /v1/run, receive an id
  2. Poll — GET /v1/run/{id} until status is completed, failed, or timeout
  3. Retrieve — Read outputs from the completed response
03

Code Examples

Ready-to-run snippets

const apiKey = process.env.SANDBASE_API_KEY;
const response = await fetch("https://api.sandbase.ai/v1/run", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "model": "meshy/7.1/text-to-3d",
    "prompt": "A rustic, antique wooden treasure chest with a curved, domed lid, constructed from weathered, dark brown planks exhibiting prominent wood grain and subtle distress. It's heavily reinforced with broad, dark grey, oxidized metal bands secured by numerous circular rivets. Ornate, dark iron decorative elements featuring swirling foliate patterns and dragon motifs adorn the corners and lid. A prominent, circular, intricately carved metal lock plate with a central keyhole dominates the front, flanked by two large, dark metallic pull rings.",
    "topology": "triangle",
    "enable_pbr": false,
    "model_type": "standard",
    "symmetry_mode": "auto",
    "enable_rigging": false,
    "enable_animation": false,
    "target_polycount": 30000,
    "geometry_resolution": "standard"
  }),
});

if (!response.ok) throw new Error(await response.text());
let result = await response.json();
for (let attempt = 0; attempt < 120 && !["completed", "failed", "timeout"].includes(result.status); attempt++) {
  await new Promise((resolve) => setTimeout(resolve, 2_000));
  const poll = await fetch(`https://api.sandbase.ai/v1/run/${result.id}`, {
    headers: { Authorization: `Bearer ${apiKey}` },
  });
  if (!poll.ok) throw new Error(await poll.text());
  result = await poll.json();
}
if (result.status !== "completed") throw new Error(`Generation ended: ${result.status}`);
console.log(result);