EVERYTHING Studios
API Documentation

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:

POST /v1/jobs
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:

202 Accepted
{
  "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:

GET /v1/jobs/{job_id}
curl https://api.everythingstudios.ai/v1/jobs/01JAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \
  -H "Authorization: Bearer esk_YOUR_API_KEY"

A finished response looks like this:

200 OK
{
  "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.

create → poll → download
# 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.

Keep reading