lowpoly avvecklas den 30 okt. 2026. Byt modell före dessa datum för att undvika fel i förfrågningar.

Snabbstart

Börja med att skapa din API-nyckel

Varje förfrågan i den här guiden behöver en. Att skapa en nyckel tar bara några sekunder.

Skapa din API-nyckel

Fyra steg till din första 3D-modell, med hjälp av Meshy REST API.


1Skaffa din API-nyckel

Skapa en API-nyckel från sidan API Keys i Developer Platform — du kommer inte att kunna visa den igen efter den här skärmen, så spara den på ett säkert ställe. Varje förfrågan autentiseras med en Bearer-token i Authorization-headern — se Autentisering.

Öppna sidan API Keys i Developer Platform och skapa sedan din nyckel


2Gör din första Image-to-3D-förfrågan

Exportera din nyckel och skapa sedan din första uppgift med Bild till 3D. Arbetar du istället utifrån en textprompt eller flera foton? Se Text till 3D eller Flera bilder till 3D.

Export your key

export MESHY_API_KEY="<your-api-key>"

Varje exempel nedan använder detta foto — byt ut mot din egen image_url för att prova något annat.

Exempel på en fantasyfigur-illustration som används som Image to 3D-input i den här guiden
Exempel på indata

Request

POST
/openapi/v1/image-to-3d
curl https://api.meshy.ai/openapi/v1/image-to-3d \
  -X POST \
  -H "Authorization: Bearer ${MESHY_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "image_url": "https://docs.meshy.ai/images/api/quick-start/source-photo.webp"
  }'

3Kontrollera uppgiftens status

Uppgiften körs i bakgrunden och tar vanligtvis några minuter. Fråga samma endpoint upprepade gånger tills status är SUCCEEDED, FAILED eller CANCELED, och ersätt <task_id> nedan med ID:t som returnerades i steg 2. För typiska tider och hur länge du bör vänta, se Task Lifecycle.

Request

GET
/openapi/v1/image-to-3d/:id
curl https://api.meshy.ai/openapi/v1/image-to-3d/<task_id> \
  -H "Authorization: Bearer ${MESHY_API_KEY}"

Response — SUCCEEDED

{
  "id": "018a210d-8ba4-705c-b111-1f1776f7f578",
  "status": "SUCCEEDED",
  "progress": 100,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/018a210d-8ba4-705c-b111-1f1776f7f578/output/model.glb?Expires=***",
    "fbx": "https://assets.meshy.ai/***/tasks/018a210d-8ba4-705c-b111-1f1776f7f578/output/model.fbx?Expires=***"
  },
  "thumbnail_url": "https://assets.meshy.ai/***/tasks/018a210d-8ba4-705c-b111-1f1776f7f578/output/preview.png?Expires=***",
  "task_error": {
    "message": ""
  }
}

4Ladda ner din modell

Hämta modellen från model_urls i svaret ovan. Varje format (GLB, FBX, OBJ, USDZ, STL) är en signerad URL med begränsad giltighetstid — eller hoppa över kommandoraden och klistra in URL:en direkt i webbläsarens adressfält för att ladda ner den.

Download

model_urls.glb
curl -L "<model_urls.glb from the response above>" -o model.glb
Den resulterande 3D-modellen som genererats från exempelfotot på fantasykaraktären
Your result

Sätt ihop allt

Föredrar du ett enda skript som gör hela flödet — skapa, polla, ladda ner?

Full script

import axios from 'axios';
import fs from 'fs';

const headers = { Authorization: `Bearer ${process.env.MESHY_API_KEY}` };
const imageUrl = 'https://docs.meshy.ai/images/api/quick-start/source-photo.webp';

// 1. Create the task
const { data: created } = await axios.post(
  'https://api.meshy.ai/openapi/v1/image-to-3d',
  { image_url: imageUrl },
  { headers, timeout: 60_000 },
);
const taskId = created.result;

// 2. Poll until it finishes, for up to 60 minutes
const deadline = Date.now() + 60 * 60 * 1000;
let task;
while (true) {
  const { data, headers: resHeaders } = await axios.get(
    `https://api.meshy.ai/openapi/v1/image-to-3d/${taskId}`,
    { headers, timeout: 30_000 },
  );
  task = data;
  if (['SUCCEEDED', 'FAILED', 'CANCELED'].includes(task.status)) break;
  if (Date.now() > deadline) {
    // The task is still running. Check it again later with the same task ID instead of creating a new one.
    throw new Error(`Task ${taskId} is still ${task.status}; check it again later`);
  }
  const waitSeconds = Number(resHeaders['retry-after']) || 5;
  await new Promise((resolve) => setTimeout(resolve, waitSeconds * 1000));
}

// 3. Download the result (only if the task succeeded)
if (task.status !== 'SUCCEEDED') {
  throw new Error(`Task ${task.status}: ${task.task_error?.message || 'unknown error'}`);
}
const { data: model } = await axios.get(task.model_urls.glb, { responseType: 'arraybuffer' });
fs.writeFileSync('model.glb', model);
console.log('Saved model.glb');

Explore common workflows


Nästa steg

  • Föredrar du ett användargränssnitt? Öppna Developer Platform — kör förfrågningar i Playground, följ upp användning och förfrågningsloggar, och hantera webhooks.
  • Bläddra i den fullständiga API-referensen för varje endpoint.
  • Lär dig av fungerande exempel: följ steg-för-steg-recept i Cookbook och läs handledningar och byggberättelser på Developer Blog.
  • Kontrollera Priser, Rate Limits och Fel innan du går i produktion.
  • Håll ett öga på ändringsloggen för uppdateringar och buggfixar.
  • Har du feedback eller stöter på problem? Gå med i vår Discord-community — vi vill gärna höra från dig!