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.
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.
Sign in to your dashboard and copy your API key.
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);
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)
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
- Sign in to your dashboard
- Copy your API key from the "API Access" section
Never share it publicly or commit to version control. Use environment variables.
Base URL
https://rage3d-api-797053387346.asia-south1.run.app
Pricing
Bulk pricing
- 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) orGET /pricing.
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
- Image upload — Your image is validated
- AI analysis — AI understands 3D structure
- Geometry generation — Optimized mesh created
- Texture creation — 8K PBR textures generated
- 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
| Requirement | Value |
|---|---|
| Formats | JPEG, PNG, WebP |
| Max file size | 10 MB per image |
| Min resolution | 256 × 256 pixels |
| Recommended | 1024 × 1024 or higher |
| Number of images | 1-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.
Download your models before they expire.
Generate 3D Model
Submits an image for 3D model generation. Returns a task ID for polling.
Request
Content-Type: multipart/form-data
| Parameter | Type | Description |
|---|---|---|
| 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, 10000–2000000. 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.
| Parameter | Values | Default | Description |
|---|---|---|---|
| model | maxstandardlitelowpoly |
max |
Generation model tier.max — highest quality (default)standard — balanced quality and speedlite — fastest, lighter detaillowpoly — 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. |
lowpoly modelThe 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"
{
"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 status. Poll until status is "success" or "failed".
{
"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
| Status | Description |
|---|---|
queued | Waiting in queue |
running | In progress (check progress) |
success | Complete. Download URLs available. |
failed | Failed. Check error field. |
The stage field
Use stage to tell "working" from "stalled" without a blind timeout:
| Stage | Meaning |
|---|---|
queued | Waiting to start |
reconstructing | Building geometry |
finalizing | Mesh export / texture bake. A long progress: 99 here is normal, not a hang. |
ready | Done — download URLs available |
failed | Terminal failure |
eta_secondsA 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.
{
"task_id": "42539d4f-9ce0-4599-8da5-21c58477562c",
"status": "success",
"stage": "ready",
"model_url": "https://...",
"stl_url": "https://...",
"rendered_image_url": "https://..."
}
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
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
Download generated 3D model file. STL files include a proper header for compatibility with Windows 3D Viewer and other software.
| Parameter | Description |
|---|---|
| task_id | Task UUID |
| file_type | glb, 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:
| Response | Meaning | Action |
|---|---|---|
| 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. |
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
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
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
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"
}
| Code | Meaning | What to do |
|---|---|---|
| 400 | Bad Request | Check parameters |
| 401 | Unauthorized | Check API key |
| 402 | Payment Required | Recharge wallet |
| 410 | Gone — expired | File is past its 7-day window. Generate a new model. |
| 422 | Content policy | Image rejected — see below; often passes on re-submit |
| 429 | Rate Limited | Wait and retry |
| 503 | Not ready yet | Retryable. 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:
| Response | error | Meaning | Retry? |
|---|---|---|---|
| 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
stageisreadyorfailed - Use
stage— not a wall-clock timeout — to decide if a task is stuck. A longprogress: 99withstage: "finalizing"is normal export work. - Download only after
stage: "ready"; a503means retry, a410means don't - Prefer
callback_urlover 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