Generate API
A REST API for 3D model generation. Submit an asynchronous image-to-3D job, poll for completion or receive a webhook, then download the GLB from permanent CDN URLs. This page walks you from zero to a finished model.
What this is
The Generate API turns product photos into production-ready 3D models. Every request is an asynchronous job: you create it, the platform runs inference, and you pick up the result as a GLB hosted on https://assets.everythingstudios.ai. Model URLs never expire.
- Base URL:
https://api.everythingstudios.ai - Format: JSON in, JSON out. All requests need an API key — see Authentication.
Quickstart
1. Get an API key
API keys are created on the dashboard's API page. Creating keys requires an active subscription. A new key looks like esk_… and is shown exactly once at creation — store it somewhere safe.
Want to try the API first, with no signup? The public test key esk_testmode works in place of a real key: jobs succeed immediately with a fixed sample model, and cost nothing. See Authentication for details.
2. Create a job
Jobs are created with POST /v1/jobs. The body selects a job type and its input — here we turn a single product photo into a 3D model:
curl -X POST https://api.everythingstudios.ai/v1/jobs \
-H "Authorization: Bearer esk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "image-to-3d",
"input": {
"image_urls": ["https://example.com/product-photo.jpg"]
}
}'A successful creation returns 202 with the job id:
{
"job_id": "01JAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}Job ids are ULIDs — sortable, unique, and the handle for everything else you do with the job.
3. Poll for completion
Fetch the job with GET /v1/jobs/{job_id} until status is SUCCEEDED (or a terminal failure). A poll every 2–5 seconds is plenty:
curl https://api.everythingstudios.ai/v1/jobs/01JAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \
-H "Authorization: Bearer esk_YOUR_API_KEY"A finished response looks like this:
{
"task_id": "01JAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"type": "image-to-3d",
"status": "SUCCEEDED",
"progress": 100,
"model_urls": {
"glb": "https://assets.everythingstudios.ai/models/01JAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/model.glb"
},
"thumbnail_url": "https://assets.everythingstudios.ai/models/01JAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/thumb.jpg",
"error": null,
"created_at": "2026-01-15T10:04:11Z",
"finished_at": "2026-01-15T10:07:52Z"
}4. Download the model
Grab model_urls.glb. The URL is a permanent CDN link — no expiry, no signature, safe to store or serve directly to viewers.
End to end, in one script
The same flow as a single runnable script per language: create, poll, print the GLB URL.
# 1. Create the job and capture the id
JOB_ID=$(curl -s -X POST https://api.everythingstudios.ai/v1/jobs \
-H "Authorization: Bearer esk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"type":"image-to-3d","input":{"image_urls":["https://example.com/product-photo.jpg"]}}' \
| sed -E 's/.*"job_id":"([^"]+)".*/\1/')
# 2. Poll until SUCCEEDED, then print the GLB URL
while true; do
STATUS=$(curl -s https://api.everythingstudios.ai/v1/jobs/$JOB_ID \
-H "Authorization: Bearer esk_YOUR_API_KEY" \
| sed -E 's/.*"status":"([^"]+)".*/\1/')
echo "status: $STATUS"
[ "$STATUS" = "SUCCEEDED" ] && break
[ "$STATUS" = "FAILED" ] && exit 1
sleep 3
done
curl -s https://api.everythingstudios.ai/v1/jobs/$JOB_ID \
-H "Authorization: Bearer esk_YOUR_API_KEY" \
| sed -E 's/.*"glb":"([^"]+)".*/\1/'Task lifecycle
Every job moves through the statuses PENDING → QUEUED → IN_PROGRESS → SUCCEEDED | FAILED | CANCELED, and carries an advisory progress value from 0–100. See Job status for the full task object and progress semantics.