Rage3D API

Transform 2D images into high-quality 3D models using advanced AI. Our API produces industry-leading results with 8K textures, PBR materials, and optimized geometry suitable for 3D printing, game development, e-commerce, and visualization.

💡
New to Rage3D?

Start with the Quickstart guide to generate your first 3D model in under 5 minutes.

What you can build

  • E-commerce product visualization — Convert product photos to interactive 3D models
  • 3D printing services — Generate print-ready STL files from any image
  • Game asset creation — Create game-ready models with PBR textures
  • AR/VR applications — Build immersive experiences with AI-generated 3D content

Key features

  • 8K HD Textures — Ultra-detailed PBR materials
  • Multiple input support — Single image or multi-view (up to 4 images)
  • 3D print ready — Automatic STL conversion
  • Fast processing — Most models ready in under 2 minutes

Quickstart

Generate your first 3D model in 4 simple steps.

1
Get your API key

Sign in to your dashboard and copy your API key.

2
Submit an image for 3D generation
curl -X POST https://rage3d-api-797053387346.asia-south1.run.app/generate-3d \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "images=@photo.jpg"
import requests

response = requests.post(
    "https://rage3d-api-797053387346.asia-south1.run.app/generate-3d",
    headers={"X-API-Key": "YOUR_API_KEY"},
    files={"images": open("photo.jpg", "rb")}
)

task_id = response.json()["task_id"]
print(f"Task ID: {task_id}")
const fs = require('fs');
const FormData = require('form-data');
const axios = require('axios');

const form = new FormData();
form.append('images', fs.createReadStream('photo.jpg'));

const response = await axios.post(
    'https://rage3d-api-797053387346.asia-south1.run.app/generate-3d',
    form,
    { headers: { 'X-API-Key': 'YOUR_API_KEY', ...form.getHeaders() } }
);

console.log('Task ID:', response.data.task_id);
3
Poll for completion

Generation takes 1-3 minutes. Poll until status is "success".

curl https://rage3d-api-797053387346.asia-south1.run.app/task/YOUR_TASK_ID \
  -H "X-API-Key: YOUR_API_KEY"
import time

while True:
    status = requests.get(
        f"https://rage3d-api-797053387346.asia-south1.run.app/task/{task_id}",
        headers={"X-API-Key": "YOUR_API_KEY"}
    ).json()
    
    print(f"Progress: {status['progress']}%")
    
    if status["status"] == "success":
        print("Done!", status['pbr_model_url'])
        break
    elif status["status"] == "failed":
        print("Failed")
        break
    
    time.sleep(5)
4
Download your 3D model
curl https://rage3d-api-797053387346.asia-south1.run.app/download/YOUR_TASK_ID/glb \
  -H "X-API-Key: YOUR_API_KEY" \
  -o model.glb

Authentication

All API requests require an API key in the X-API-Key header.

X-API-Key: hyp3d_your_api_key_here

Getting your API key

  1. Sign in to your dashboard
  2. Copy your API key from the "API Access" section
⚠️
Keep your API key secure

Never share it publicly or commit to version control. Use environment variables.

Base URL

https://rage3d-api-797053387346.asia-south1.run.app

Pricing

₹199 INR
Per 3D Model Generation
Includes HD GLB model, 8K PBR textures, and STL conversion

Bulk pricing

₹149 INR
Per generation — bulk rate
Once you have purchased 10,000 generations in total, every generation from then on is billed at ₹149 instead of ₹199 — a 25% saving.
  • Cumulative, not per-order — your purchased generations add up across every recharge until you reach the threshold.
  • Permanent once unlocked — after you qualify, the ₹149 rate applies to every future recharge and generation, automatically.
  • Nothing to claim — the discount is applied by the system; no coupon or sales contact needed.
  • Check your current rate any time via GET /auth/me (generation_cost) or GET /pricing.
🏢
Need volume beyond this?

For committed volume or custom terms, contact support@rage3d.online.

How billing works

  • Prepaid wallet — Add funds from dashboard
  • Per-generation — ₹199 deducted when you submit
  • No hidden fees — STL conversion and downloads are free
  • Failed generations — Not charged if generation fails

How It Works

The generation pipeline

  1. Image upload — Your image is validated
  2. AI analysis — AI understands 3D structure
  3. Geometry generation — Optimized mesh created
  4. Texture creation — 8K PBR textures generated
  5. Model packaging — GLB file with embedded textures

Asynchronous processing

3D generation takes 1-3 minutes. The API returns a task_id immediately, then poll GET /task/{task_id} to check progress.

Image Requirements

RequirementValue
FormatsJPEG, PNG, WebP
Max file size10 MB per image
Min resolution256 × 256 pixels
Recommended1024 × 1024 or higher
Number of images1-4 per request

Tips for best results

  • Clear subject with good lighting
  • Simple or white backgrounds
  • For complex objects, provide 2-4 views

Output Formats

GLB (default)

Binary glTF with embedded 8K PBR textures. Industry standard for web 3D.

STL (optional)

Geometry-only format for 3D printing. Use POST /task/{id}/convert-stl.

Files expire after 7 days

Download your models before they expire.

Generate 3D Model

POST /generate-3d

Submits an image for 3D model generation. Returns a task ID for polling.

Request

Content-Type: multipart/form-data

ParameterTypeDescription
images File 1-4 image files (JPEG, PNG, WebP), max 10MB each. 1 image → single-image mode; 2-4 fill the view slots in order (front, left, back, right). Use this or the view-targeted fields below.
image_frontrequired*
image_left
image_back
image_right
File View-targeted input. Place a photo in a specific view slot and skip the rest — e.g. send just image_front + image_back.
* image_front is required whenever you use any of these fields. Send at least 2 views for multiview (1 = single-image mode). Use these instead of images, not both.
target_faces Integer Optional. Triangle budget, 100002000000. Omit for full resolution (~2M triangles). e.g. 600000 returns a much lighter mesh (~30 MB) — decimated server-side, watertight.
callback_url String Optional. An https:// URL. When the model finishes, we POST a signed webhook there so you don't have to poll. See Webhooks.

Quality & model options

All optional — omit any field to use the default shown. Defaults are tuned for maximum quality.

ParameterValuesDefaultDescription
model max
standard
lite
lowpoly
max Generation model tier.
max — highest quality (default)
standard — balanced quality and speed
lite — fastest, lighter detail
lowpoly — low-poly / PBR workflow; see the note below
texture_quality standard (2K)
detailed (4K)
extreme (8K)
extreme Texture resolution. Defaults to 8K; drop to detailed or standard for smaller files and faster generation.
geometry_quality standard / detailed detailed Mesh detail level (detailed = ultra).
texture boolean true Generate textures at all.
pbr boolean true PBR materials. Enabling this forces texture: true.
quad boolean false Quad topology instead of triangles. Quad output implies FBX.
smart_low_poly boolean false Low-poly optimised reconstruction.
generate_parts boolean false Return the model split into parts. Requires texture=false.
texture_alignment original_image / geometry original_image Whether texturing prioritises matching the input image or the geometry.
orientation default / align_image default Align the model's orientation to the input image.
enable_image_autofix boolean true Let the engine clean up / complete the input image before reconstruction.
auto_size boolean false Scale the result to plausible real-world dimensions.
export_uv boolean true Include UV coordinates in the export.
return_multiview boolean false Also return the generated multiview images.
compress geometry or empty empty Apply geometry compression to the output.
model_seed
texture_seed
integer random Fix the seeds to make a generation reproducible.
check_printable boolean false Run 3D-printability checks. Requires an account entitlement.
⚠️
Using the lowpoly model

The lowpoly model ignores quad, smart_low_poly, generate_parts and geometry_quality — leave them out. Its target_faces window is also much smaller: 50–20000 (all other models: 10000–2000000).

# Lighter mesh + webhook instead of polling
curl -X POST https://rage3d-api-797053387346.asia-south1.run.app/generate-3d \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "images=@photo.jpg" \
  -F "target_faces=600000" \
  -F "callback_url=https://your.app/hooks/rage3d"

# View-targeted: send specific angles (e.g. front + back only)
curl -X POST https://rage3d-api-797053387346.asia-south1.run.app/generate-3d \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "image_front=@front.jpg" \
  -F "image_back=@back.jpg"
Response 200 OK
{
  "task_id": "42539d4f-9ce0-4599-8da5-21c58477562c",
  "status": "queued",
  "message": "Task submitted. Use GET /task/{task_id} to check status.",
  "balance_after": 1881.0,
  "cost": 199.0
}

Get Task Status

GET /task/{task_id}

Get task status. Poll until status is "success" or "failed".

Response (success)
{
  "task_id": "42539d4f-9ce0-4599-8da5-21c58477562c",
  "status": "success",
  "progress": 100,
  "stage": "ready",
  "eta_seconds": null,
  "model_url": "https://...",
  "pbr_model_url": "https://...",
  "rendered_image_url": "https://...",
  "expires_at": "2026-03-21T12:00:00+00:00"
}

Status values

StatusDescription
queuedWaiting in queue
runningIn progress (check progress)
successComplete. Download URLs available.
failedFailed. Check error field.

The stage field

Use stage to tell "working" from "stalled" without a blind timeout:

StageMeaning
queuedWaiting to start
reconstructingBuilding geometry
finalizingMesh export / texture bake. A long progress: 99 here is normal, not a hang.
readyDone — download URLs available
failedTerminal failure
⏱️
eta_seconds

A rough estimate of seconds remaining while running (derived from progress and elapsed time). Best-effort, not a guarantee — null when queued, complete, or just started.

Webhooks

Instead of polling, pass a callback_url on /generate-3d. When the job reaches a terminal state, we POST a JSON body to that URL.

Webhook payload
{
  "task_id": "42539d4f-9ce0-4599-8da5-21c58477562c",
  "status": "success",
  "stage": "ready",
  "model_url": "https://...",
  "stl_url": "https://...",
  "rendered_image_url": "https://..."
}
🔐
Verify the signature

Every delivery carries an X-Rage3D-Signature header: an HMAC-SHA256 of the raw request body, keyed with your webhook secret. Recompute it and compare before trusting the payload. Respond 2xx to acknowledge; non-2xx responses are retried.

Convert to STL

POST /task/{task_id}/convert-stl

Convert completed model to STL format for 3D printing.

curl -X POST https://rage3d-api-797053387346.asia-south1.run.app/task/YOUR_TASK_ID/convert-stl \
  -H "X-API-Key: YOUR_API_KEY"

Download File

GET /download/{task_id}/{file_type}

Download generated 3D model file. STL files include a proper header for compatibility with Windows 3D Viewer and other software.

ParameterDescription
task_idTask UUID
file_typeglb, stl, or png (preview image)
key (query)API key (optional, for browser downloads)
# Download GLB (using header auth)
curl https://rage3d-api-797053387346.asia-south1.run.app/download/TASK_ID/glb \
  -H "X-API-Key: YOUR_API_KEY" -o model.glb

# Download STL (using query param auth - works in browser)
curl "https://rage3d-api-797053387346.asia-south1.run.app/download/TASK_ID/stl?key=YOUR_API_KEY" -o model.stl

Not ready vs. expired

These are two different outcomes and should be handled differently — don't treat every download failure as permanent:

ResponseMeaningAction
503 The file isn't available yet — typically the task is still processing, or a transient storage hiccup. Retry. Wait until GET /task/{id} reports stage: "ready", then download.
410 The file is genuinely past its 7-day retention window. Don't retry. Generate a new model.
💡
Download after the task is ready

Poll GET /task/{task_id} until stage is ready before downloading. Requesting a file mid-generation returns 503, not the file — and the preview png may not exist until the model completes.

List Generations

GET /generations

List your previous generations with status and output URLs.

curl https://rage3d-api-797053387346.asia-south1.run.app/generations?limit=10 \
  -H "X-API-Key: YOUR_API_KEY"

Get Wallet Balance

GET /wallet/balance
curl https://rage3d-api-797053387346.asia-south1.run.app/wallet/balance \
  -H "X-API-Key: YOUR_API_KEY"

# Response:
{
  "balance": 1990.0,
  "message": "You can generate 10 models with current balance"
}

Get Profile

GET /auth/me
curl https://rage3d-api-797053387346.asia-south1.run.app/auth/me \
  -H "X-API-Key: YOUR_API_KEY"

# Response:
{
  "email": "user@example.com",
  "name": "John Doe",
  "balance": 1990.0,
  "total_generations": 24,
  "generation_cost": 199.0
}

Error Handling

{
  "detail": "Insufficient balance. Required: ₹199, Available: ₹50"
}
CodeMeaningWhat to do
400Bad RequestCheck parameters
401UnauthorizedCheck API key
402Payment RequiredRecharge wallet
410Gone — expiredFile is past its 7-day window. Generate a new model.
422Content policyImage rejected — see below; often passes on re-submit
429Rate LimitedWait and retry
503Not ready yetRetryable. File isn't available yet — retry once the task reports stage: "ready".

Content-policy rejections (422)

If an image is rejected, you get a machine-actionable body. Branch on error, not the message text. Note the phase field: submission means it was rejected up front, generation means it was rejected after processing started (in which case the rejection surfaces when you poll the task).

{
  "error": "content_policy_violation",
  "code": 2008,
  "message": "...",
  "suggestion": "...",
  "retryable": true,
  "phase": "submission"
}

retryable: true means the classifier is non-deterministic across renders — re-submitting a re-rendered image often passes.

Generation failures

If a task fails after it started, polling it returns one of these. All carry error, code, message and retryable:

ResponseerrorMeaningRetry?
422 content_policy_violation Rejected by content moderation during generation. Yes — re-render and resubmit
503 queue_timeout The task waited too long in the queue and was dropped. Yes — resubmit
502 generation_failed Generation failed for another reason; message explains it. No — inspect the message first

Best Practices

Polling strategy

  • Poll every 5-10 seconds
  • Stop when stage is ready or failed
  • Use stage — not a wall-clock timeout — to decide if a task is stuck. A long progress: 99 with stage: "finalizing" is normal export work.
  • Download only after stage: "ready"; a 503 means retry, a 410 means don't
  • Prefer callback_url over polling at scale — see Webhooks
  • Implement exponential backoff for rate limits

Image optimization

  • Use 1024×1024 or higher resolution
  • Good lighting, clear subject
  • Plain backgrounds work best

Security

  • Never hardcode API keys
  • Use environment variables
  • Separate keys for dev/production