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 â Generate characters, then auto-rig & animate them into engine-ready GLB/FBX for Unity, Unreal & Blender
- 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. |
| detail_level | String |
Optional. Selects the reconstruction pipeline. Omit for the standard pipeline (honours model and every quality option below).
Set to pictography for the ultimate fine-detail pipeline: a full-density native mesh (~1â2M triangles) with 8K PBR, returning STL/GLB/FBX. See the note below for when to use it.
|
| 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. |
detail_level=pictography
Reach for pictography when you're producing STLs that need fine surface detail â facial features, sculpted ornamentation, engravings, intricate geometry for high-fidelity 3D printing. It returns the model's full native mesh instead of a decimated one, so small details survive. For everyday web/AR models or lighter files, use the standard pipeline (omit detail_level) â pictography produces much larger files (STL can exceed 70 MB) and ignores the fine geometry knobs below (target_faces, texture_quality, quad, âĻ), always running at maximum settings.
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" # Ultimate fine-detail STL (facial features, engravings, sculpt detail) curl -X POST https://rage3d-api-797053387346.asia-south1.run.app/generate-3d \ -H "X-API-Key: YOUR_API_KEY" \ -F "images=@bust.jpg" \ -F "detail_level=pictography"
{
"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, fbx, stl, or png (preview image). fbx is available for rigged / animated tasks. |
| 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"
đŽ Game Development: Rig & Animate
Turn any generated character into a game-ready asset. Auto-rig a skeleton onto your model, apply preset animations (walk, run, jump, idle and more), and export an animated GLB or FBX that drops straight into Unity, Unreal Engine, or Blender.
1. Generate a character model (/generate-3d) â 2. Auto-rig it (/task/{id}/rig) â 3. Apply an animation (/task/{rig_id}/animate) â download the animated GLB/FBX.
Requirements
- Rigging works best on a character / humanoid or creature model â a clear body with limbs. Props and inanimate objects can't be rigged.
- Start from a completed generation (
stage: "ready"). You rig using itstask_id. - Rig and animate steps are billed at your standard per-generation rate. Riggability checks are free.
Check Riggability
Checks whether a completed model can be rigged, free of charge. Call this before rigging to avoid surprises â the rig endpoint also runs this check internally and won't charge you if the model isn't riggable.
| Parameter | Description |
|---|---|
| task_id | The task_id of a completed generation. |
curl -X POST https://rage3d-api-797053387346.asia-south1.run.app/task/TASK_ID/rig-check \
-H "X-API-Key: YOUR_API_KEY"
{
"task_id": "42539d4f-9ce0-4599-8da5-21c58477562c",
"riggable": true
}
Auto-Rig a Character
Generates a skeleton and skin weights for a completed character model and returns a
new rig task. Poll the returned task_id like any other
task; when it's ready, download the rigged model or feed it to the
animate endpoint.
Content-Type: multipart/form-data
| Parameter | Values | Default | Description |
|---|---|---|---|
| out_format | glb / fbx |
glb |
Export format for the rigged model. FBX is convenient for Unity/Unreal import. |
| spec | standard / mixamo |
standard |
Skeleton specification. mixamo produces a Mixamo-compatible bone naming/hierarchy for engines and tools that expect it. |
This endpoint runs a riggability check first. If the model can't be rigged it returns 422 not_riggable and nothing is deducted.
curl -X POST https://rage3d-api-797053387346.asia-south1.run.app/task/TASK_ID/rig \ -H "X-API-Key: YOUR_API_KEY" \ -F "out_format=fbx" \ -F "spec=mixamo"
{
"task_id": "7b2c1e90-4a3d-4f21-9c88-1f2e3a4b5c6d",
"status": "queued",
"kind": "rig",
"source_task_id": "42539d4f-9ce0-4599-8da5-21c58477562c",
"balance_after": 1682.0,
"cost": 199.0
}
{
"error": "not_riggable",
"message": "This model can't be rigged. Rigging works on character/creature models with a clear body and limbs."
}
Apply Animations
Applies a preset animation to a rigged model and returns a new
animation task. Use the task_id you got back from
/rig as the rig_task_id. Poll the returned
task, then download the animated GLB/FBX.
Content-Type: multipart/form-data
| Parameter | Values | Default | Description |
|---|---|---|---|
| animationrequired | see presets below | â | The preset animation clip to apply. |
| out_format | glb / fbx |
glb |
Export format for the animated model. |
Animation presets
Bipeds & general characters:
idle,walk,run,jump,fall,climb,dive,turnslash,shoot,hurt
Multi-legged & creature gaits:
quadruped_walk,hexapod_walk,octopod_walk,serpentine_march,aquatic_march
curl -X POST https://rage3d-api-797053387346.asia-south1.run.app/task/RIG_TASK_ID/animate \ -H "X-API-Key: YOUR_API_KEY" \ -F "animation=run" \ -F "out_format=fbx"
{
"task_id": "9d4e2f01-6b5c-4a12-8e77-2c3d4e5f6a7b",
"status": "queued",
"kind": "animation",
"animation": "run",
"balance_after": 1483.0,
"cost": 199.0
}
If animation isn't one of the presets above, the API responds 400 and lists the valid values â nothing is charged.
Export GLB / FBX
Rigged and animated tasks download exactly like a normal generation â use the returned
task_id with the download endpoint. Choose
glb or fbx to match the format you requested.
# Download the animated character as FBX for Unity / Unreal curl https://rage3d-api-797053387346.asia-south1.run.app/download/ANIMATION_TASK_ID/fbx \ -H "X-API-Key: YOUR_API_KEY" -o character_run.fbx # Or GLB for web / Blender curl https://rage3d-api-797053387346.asia-south1.run.app/download/ANIMATION_TASK_ID/glb \ -H "X-API-Key: YOUR_API_KEY" -o character_run.glb
GLB and FBX exports carry the skeleton, skin weights and the animation clip embedded â import directly into Unity, Unreal Engine or Blender with no extra retargeting step.
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