---
title: "Get a job"
method: GET
path: "/v2/jobs/{id}"
tags: ["Jobs"]
---

# Get a job

`GET /v2/jobs/{id}`

## Request

- Base URL: `https://api.apiframe.ai`
- URL: `https://api.apiframe.ai/v2/jobs/{id}`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Returns the current status, progress, and (when complete) the result for a single job. SDK consumers typically wrap this in a polling loop — see `client.jobs.waitFor()`.

## Path parameters

- `id` string, uuid, required

## Response `200`

Job state.

- Job: Generation job returned by `GET /v2/jobs` and `GET /v2/jobs/:id`.
  - `id` string, uuid, required
  - `status` 'QUEUED' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'CANCELLED', required
  - `model` string, required
  - `progress` integer, nullable, required
  - `input` object, nullable
  - `result` unknown
  - `error` string, nullable, required
  - `creditCost` integer, nullable, required
  - `webhookStatus` 'pending' | 'delivered' | 'failed' | 'null', nullable, required
  - `createdAt` string, date-time, required
  - `completedAt` string, date-time, nullable, required
  - `expired` boolean: `true` once a COMPLETED job's CDN assets have been purged (default 24h retention). `result` URLs may 404.

## Other responses

- `400`: `id` is not a valid UUID.
- `401`: Authentication failed (missing / invalid API key).
- `403`: Authenticated but the API key is inactive or lacks permission.
- `404`: Job not found, or owned by a different user.
- `429`: Rate limit exceeded. Retry after the `Retry-After` seconds.

---

[API](https://skmtc.dev/apiframe/apis/apiframe-api.md) · [All operations](https://skmtc.dev/apiframe/apis/apiframe-api/llms.txt) · [OpenAPI document](https://skmtc.dev/apiframe/apis/apiframe-api/revisions/ba1a4c26c86a?raw)
