Skip to content
Immersive AI

Image to 3D

3D Hunyuan3D v21 by Henri Huotari · Oct 24, 2025

Turn an image into a 3D model

This file couldn't be loaded. The link may have expired.
Input image input_image_url.png
The 3D model couldn't be loaded. Download result.glb
This file couldn't be loaded. The link may have expired.
The 3D model couldn't be loaded. Download model_glb_pbr.url.glb
This file couldn't be loaded. The link may have expired.
Output · drag to rotate

Run it yourself

Set IMMERSIVE_API_KEY to an API key from your account. Create a free account to get one.

curl -X POST 'https://ai.im.inc/api/v1/3d/generate' \
  -H "Authorization: Bearer $IMMERSIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "input_image_url": "https://s3.eu-central-1.amazonaws.com/ai.im.inc/examples/inputs/edd7d11c-d4df-464d-b8d5-1ac526ad3fc9/input_image_url.png"
}'

# Set JOB_ID to the response's "id", then poll every few seconds until the job has finished:
curl "https://ai.im.inc/api/v1/3d/$JOB_ID" \
  -H "Authorization: Bearer $IMMERSIVE_API_KEY"

# The finished response has the result at model_glb.url.
const headers = { Authorization: `Bearer ${process.env.IMMERSIVE_API_KEY}` };

const response = await fetch("https://ai.im.inc/api/v1/3d/generate", {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json" },
  body: JSON.stringify({
    "input_image_url": "https://s3.eu-central-1.amazonaws.com/ai.im.inc/examples/inputs/edd7d11c-d4df-464d-b8d5-1ac526ad3fc9/input_image_url.png"
  }),
});
const job = await response.json();

// Poll every few seconds while the job is still running.
const running = ["pending", "queued", "submitted", "starting", "processing", "running", "streaming", "in_queue", "in_progress"];
let result;
do {
  await new Promise((resolve) => setTimeout(resolve, 5000));
  result = await (await fetch(`https://ai.im.inc/api/v1/3d/${job.id}`, { headers })).json();
} while (running.includes(String(result.status).toLowerCase()));

console.log(result.model_glb.url);
import os
import time

import requests

headers = {"Authorization": f"Bearer {os.environ['IMMERSIVE_API_KEY']}"}

job = requests.post(
    "https://ai.im.inc/api/v1/3d/generate",
    headers=headers,
    json={
        "input_image_url": "https://s3.eu-central-1.amazonaws.com/ai.im.inc/examples/inputs/edd7d11c-d4df-464d-b8d5-1ac526ad3fc9/input_image_url.png",
    },
    timeout=300,
).json()

# Poll every few seconds while the job is still running.
running = {"pending", "queued", "submitted", "starting", "processing", "running", "streaming", "in_queue", "in_progress"}
while True:
    time.sleep(5)
    result = requests.get(f"https://ai.im.inc/api/v1/3d/{job['id']}", headers=headers, timeout=60).json()
    if str(result.get("status", "")).lower() not in running:
        break

print(result["model_glb"]["url"])
{
    "id": "a47465c5-70ce-4177-b909-8f271dc50061",
    "seed": 885440,
    "model": "hunyuan3d-v21",
    "status": "succeeded",
    "model_glb": {
        "url": "https://s3.eu-central-1.amazonaws.com/ai.im.inc/examples/outputs/edd7d11c-d4df-464d-b8d5-1ac526ad3fc9/result.glb",
        "file_name": "demo_textured.glb",
        "file_size": 1413712,
        "content_type": "application/octet-stream"
    },
    "model_mesh": {
        "url": "https://v3b.fal.media/files/b/panda/h0G2LN6ZupuDYh__BJij9_3d_model.zip",
        "file_name": "3d_model.zip",
        "file_size": 11106056,
        "content_type": "application/octet-stream"
    },
    "model_glb_pbr": {
        "url": "https://s3.eu-central-1.amazonaws.com/ai.im.inc/examples/outputs/edd7d11c-d4df-464d-b8d5-1ac526ad3fc9/model_glb_pbr.url.glb",
        "file_name": "demo_textured_pbr.glb",
        "file_size": 5474264,
        "content_type": "application/octet-stream"
    }
}

Your browser blocked the clipboard. Select the text and copy it by hand.

How the job runs

  1. POST returns the job's id and status right away.
  2. Poll GET /api/v1/3d/{id} every few seconds while the job is running.
  3. When status is succeeded, download model_glb.url. Failed jobs are refunded automatically.
Endpoint
POST /api/v1/3d/generate
Model
hunyuan3d-v21
Output
3D model · GLB