Jobs & polling
Most modules are asynchronous. Starting a module returns 202 Accepted with a job object. Poll until the status is terminal.
Job lifecycle
| Status | Meaning |
|---|---|
| queued | Accepted and waiting to run |
| processing | Actively generating |
| succeeded | Complete — result.image_url is present |
| failed | Terminal failure — error.code / error.message present |
Create a job
POST https://kitchengpt.io/v1/modules/{module}
Content-Type: multipart/form-data
# → 202
{
"job": {
"id": "8f3c…",
"module": "change-style",
"status": "queued",
"created_at": "2026-07-30T10:00:00+00:00",
"updated_at": "2026-07-30T10:00:00+00:00"
},
"links": { "self": "https://kitchengpt.io/v1/jobs/8f3c…" }
}Poll a job
GET https://kitchengpt.io/v1/jobs/{id}
# → 200 (succeeded)
{
"job": {
"id": "8f3c…",
"module": "change-style",
"status": "succeeded",
"result": { "image_url": "https://kitchengpt.io/storage/designs/…/result.png" },
"processing_time_ms": 18420
}
}Recommended poll interval: every 2 seconds. Back off if you receive 429.
Result URLs
Successful jobs include a publicly fetchable result.image_url. The URL is always hosted on KitchenGPT storage — never a third-party model CDN. Download and store the image in your own system if you need long-term retention — URLs may be rotated according to your commercial agreement.