> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gizmo.antimlabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Track, cancel & retry

> Poll jobs, cancel unfinished work, and recover safely without duplicate generation.

## Track progress

Poll `GET /v1/jobs/{job_id}?include_result=true` every 30–60 seconds. Save the job ID returned at acceptance. Stop polling when `job.status` is `succeeded`, `failed`, or `cancelled`. Inspect `job.error` on failure. For batches, poll the batch and paginate its items rather than polling every job.

## Cancel a job

```bash theme={null}
curl --fail-with-body -X POST "https://api.gizmo.antimlabs.com/v1/jobs/JOB_ID/cancel" \
  -H "Authorization: Bearer $GIZMO_API_KEY"
```

Cancellation requests stop unfinished work; running workers may take time to stop. Poll until terminal. Completed work is not undone. Use the [batch cancellation endpoint](/api-reference/batches/cancel-unfinished-batch-work) to stop a whole batch's unfinished items.

## Retry generation safely

Give each intended generation a unique `Idempotency-Key` (1–128 ASCII letters,
digits, dots, underscores, colons or hyphens):

```bash theme={null}
curl --fail-with-body "https://api.gizmo.antimlabs.com/v1/assets" \
  -H "Authorization: Bearer $GIZMO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: cabinet-order-2026-001" \
  -d '{"prompt":"A wooden cabinet with three sliding drawers"}'
```

Retry a lost response with the **same key and same JSON body**. Once accepted,
retries return the original job, with `Idempotency-Replayed: true`. A different body
with the same key returns `409 idempotency_key_reused` for Personal keys or
`409 idempotency_conflict` for Team keys. For Personal requests, concurrent or interrupted
acceptance returns `409 request_in_progress` with `Retry-After: 5`; retry the same
key. If that persists, contact support with `X-Request-ID` rather than creating a
new key and risking a duplicate job. Keys are scoped to your account and API deployment, and currently retained
without automatic expiry. Recorded 4xx responses are replayed too; after correcting
such a request, use a new key. Personal requests without a key create a new job each time; Team requests without a key are rejected.

The `202` response includes `Location: /v1/jobs/{id}` and `Retry-After: 30`.

## Completion notifications

Generation continues on the server when your client disconnects. Save the `job_id` to check the result later; you do not need to keep sending requests to keep generation running.

Use polling every 30–60 seconds for all account scopes. Personal-key clients can alternatively keep one SSE connection for progress and completion; Team SSE currently returns the restriction described above. The API does not provide webhooks or a guaranteed completion email. Any account email notifications are supplementary; use the job status or SSE `done` event to drive your integration.

## Streaming progress

SSE delivers a sequence of server events over one HTTP response, including progress
and the terminal `done` event. It avoids repeated status requests. The currently
deployed handler supports personal jobs; Team jobs must use polling until
Team event-store integration is available.

```bash theme={null}
curl -N "https://api.gizmo.antimlabs.com/v1/jobs/job_x9y8z7w6/events" \
  -H "Authorization: Bearer gzm_k1_YOUR_KEY"
```

Progress events include a `sequence` number. Reconnect with `?after=LAST_SEQUENCE` to receive later events. Progress event types can vary; ignore types your client does not recognize. `ping` is a keepalive. `done` includes the terminal `status` and `job_id`, and closes the stream. Fetch the job with `include_result=true` to retrieve the asset after success.

## Retry export without regeneration

If Blender authoring already succeeded and only export failed, this generation
retry returns `409 export_retry_required`. Use the saved-artifact recovery endpoint:

```bash theme={null}
curl --fail-with-body -X POST \
  "https://api.gizmo.antimlabs.com/v1/jobs/SOURCE_JOB_ID/retry-export" \
  -H "Authorization: Bearer $GIZMO_WORKSPACE_API_KEY" \
  -H "Idempotency-Key: export-retry-001"
```

This Team-only operation returns `202` with a new `job_id` and `Location`.
Poll that job and use its new `asset_id` for downloads. The original job, batch
counts and artifacts remain unchanged. `retry_of_job_id` identifies the previous
job and `retry_mode` is `export`. When known, `failure_stage` distinguishes
`blender`, `export`, and `parent` failures.

Recovery requires successful saved authoring, stopped workers, settled prior
charges and an available authoring ZIP. It uses the **original pinned release**,
not whichever exporter was most recently deployed. Retain that release's worker
app. Recovery cannot start Blender authoring or paid model/image calls. USD is
exported again and original GLB bytes are retained. Extra formats, if configured,
follow that original release’s export policy. Geometry,
physics, joints and materials are reused; only the library record ID changes for
the new result. This operation is not geometry repair or physics validation.

Normal Team capacity and its configured billing policy still apply. Do not
assume a successful export retry is free or that every policy creates a credit
hold. Modal compute costs remain separate from customer pricing. Reuse the same
idempotency key after a lost response. If this recovery also fails, its job can be
passed to `retry-export` again; saved-authoring lineage remains tied to the
original source.

## Endpoint reference

[Job status](/api-reference/jobs/get-job-status) · [Cancel a job](/api-reference/jobs/cancel-a-job) · [Retry export](/api-reference/jobs/retry-export-from-saved-authoring-without-regeneration)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.