lowpoly dihentikan pada 30 Okt 2026. Ganti model sebelum tanggal-tanggal ini agar permintaan tidak error.

Mulai cepat

Mulai dengan membuat kunci API Anda

Setiap permintaan dalam panduan ini membutuhkan satu kunci API. Membuat kunci hanya perlu beberapa detik.

Buat kunci API Anda

Empat langkah menuju model 3D pertama Anda, menggunakan Meshy REST API.


1Dapatkan kunci API Anda

Buat kunci API dari halaman API Keys di Developer Platform — Anda tidak akan dapat melihatnya lagi setelah layar ini, jadi simpan di tempat yang aman. Setiap permintaan melakukan autentikasi dengan token Bearer di header Authorization — lihat Authentication.

Buka halaman API Keys di Developer Platform, lalu buat kunci Anda


2Buat permintaan Image-to-3D pertama Anda

Ekspor kunci Anda, lalu buat tugas pertama Anda dengan Image to 3D. Bekerja dari prompt teks atau beberapa foto sebagai gantinya? Lihat Text to 3D atau Multi-Image to 3D.

Export your key

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

Setiap contoh di bawah ini menggunakan foto ini — ganti dengan image_url Anda sendiri untuk mencoba hal lain.

Ilustrasi karakter fantasi contoh yang digunakan sebagai input Image to 3D dalam panduan ini
Contoh input

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"
  }'

3Periksa status tugas

Tugas berjalan di latar belakang dan biasanya memakan waktu beberapa menit. Lakukan polling pada endpoint yang sama hingga status bernilai SUCCEEDED, FAILED atau CANCELED, dengan mengganti <task_id> di bawah ini dengan ID yang dikembalikan pada langkah 2. Untuk waktu yang biasanya diperlukan dan berapa lama harus menunggu, lihat 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": ""
  }
}

4Unduh model Anda

Ambil model dari model_urls pada respons di atas. Setiap format (GLB, FBX, OBJ, USDZ, STL) adalah URL bertanda tangan yang memiliki batas waktu — atau lewati baris perintah dan tempelkan URL tersebut langsung ke bilah alamat browser Anda untuk mengunduhnya.

Download

model_urls.glb
curl -L "<model_urls.glb from the response above>" -o model.glb
The resulting 3D model generated from the sample fantasy character photo
Your result

Satukan semuanya

Lebih suka satu skrip yang melakukan semuanya — membuat, polling, mengunduh?

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');

Jelajahi alur kerja umum


Langkah berikutnya

  • Lebih suka menggunakan UI? Buka Developer Platform — jalankan permintaan di Playground, lacak penggunaan dan log permintaan, serta kelola webhook.
  • Jelajahi referensi API lengkap untuk setiap endpoint.
  • Pelajari dari contoh nyata: ikuti resep langkah demi langkah di Cookbook dan baca tutorial serta kisah pengembangan di Developer Blog.
  • Periksa Harga, Rate Limits, dan Kesalahan sebelum masuk ke tahap produksi.
  • Pantau catatan perubahan untuk pembaruan dan perbaikan bug.
  • Punya masukan atau mengalami masalah? Bergabunglah dengan komunitas Discord kami — kami senang mendengar dari Anda!