Job status
Retrieve a single job by id, or page through your account's jobs. Both endpoints return the same task object — the one shape you'll see while polling and in webhook payloads.
GET/v1/jobs/{id}
Retrieve a single job. Replace {id} with the job_id returned at creation.
curl https://api.everythingstudios.ai/v1/jobs/01JAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \
-H "Authorization: Bearer esk_YOUR_API_KEY"A successful response is the full task object:
{
"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"
}Task object
| Field | Type | Required | Description |
|---|---|---|---|
| task_id | string | — | ULID. The same value as the job_id returned when you created the job. |
| type | string | — | Always image-to-3d — the only supported job type. |
| status | string | — | PENDING | QUEUED | IN_PROGRESS | SUCCEEDED | FAILED | CANCELED. |
| progress | number | — | 0–100, advisory. A rough signal for progress bars — treat status as the source of truth. |
| model_urls | object | null | — | Contains the key glb — a permanent CDN URL on assets.everythingstudios.ai, no expiry. GLB is the only format produced today. |
| thumbnail_url | string | null | — | JPEG thumbnail on the same CDN. Permanent. |
| error | object | null | — | { code, message } describing the failure, present on FAILED jobs; null otherwise. |
| created_at | string | — | ISO 8601 timestamp of job creation. |
| finished_at | string | — | ISO 8601 timestamp. null until the job reaches a terminal status. |
Progress guidance
progress is advisory, but it maps to real pipeline stages:
0— job accepted.5— preparing inputs.25— queued and allocated for inference.- up to
90— inference complete, model in post-processing. 100— done.
Stop polling once status reaches a terminal value — SUCCEEDED, FAILED or CANCELED. A poll every 2–5 seconds is a comfortable cadence; if you'd rather not poll at all, switch to webhook delivery. There is no SSE or long-poll endpoint.
Jobs cannot be canceled through the public API — once submitted, a job runs to completion.
GET/v1/jobs
List your account's jobs, newest first, with cursor pagination.
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
| status | string | no | Filter by status — one of PENDING, QUEUED, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED. Any other value returns 400. |
| limit | number | no | Page size, 1–100. Defaults to 20. |
| cursor | string | no | Opaque base64url pagination token from a previous response's next_cursor. An invalid token returns 400 invalid_cursor. |
The response is a page of task objects plus the cursor for the next page. next_cursor is omitted on the last page. Jobs are returned newest first:
curl "https://api.everythingstudios.ai/v1/jobs?status=SUCCEEDED&limit=5" \
-H "Authorization: Bearer esk_YOUR_API_KEY"{
"jobs": [
{
"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"
},
{
"task_id": "01JBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"type": "image-to-3d",
"status": "SUCCEEDED",
"progress": 100,
"model_urls": {
"glb": "https://assets.everythingstudios.ai/models/01JBBBBBBBBBBBBBBBBBBBBBBBBBBBBB/model.glb"
},
"thumbnail_url": "https://assets.everythingstudios.ai/models/01JBBBBBBBBBBBBBBBBBBBBBBBBBBBBB/thumb.jpg",
"error": null,
"created_at": "2026-01-14T18:22:03Z",
"finished_at": "2026-01-14T18:26:41Z"
}
],
"next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wMS0xNFQxODoyMjozM1oifQ"
}To page through results, pass the previous response's next_cursor as the cursor query parameter. Stop when next_cursor no longer appears.