# Read the job envelope; `Prefer: wait` long-polls for a state change

GET /v1/jobs/{id}: Read the job envelope; `Prefer: wait` long-polls for a state change

```http
GET /v1/jobs/{id}
```

|  |  |
|---|---|
| Operation id | `getJob` |
| Key scope | `read`: every key |
| Section | [Jobs](https://docs.kaab.ist/reference/api#jobs) |

## Parameters

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | string | yes | pattern `^job_[0-9a-hjkmnp-tv-z]{26}$` |
| `since_status` | query | enum (7 values) |  | With `Prefer: wait`: answer once the status differs from this one (the state you last saw) instead of from the state at request start. · one of `"queued"`, `"running"`, `"awaiting_input"`, `"needs_attention"`, `"succeeded"`, `"failed"`, `"canceled"` |
| `prefer` | header | string |  | `wait=<1-60>`: wait up to that many seconds for the job to finish |

## Example request

```bash
curl -X GET "https://api.kaab.ist/v1/jobs/{id}" \
  -H "Authorization: Bearer $KAAB_API_KEY"
```

## Responses

### 200

Job envelope

[Job](https://docs.kaab.ist/reference/api/schemas/job)

```json
{
  "id": "job_01j9zqk3q7m4n5p6r7s8t9v0wx",
  "object": "job",
  "mode": "live",
  "status": "queued",
  "reason": null,
  "program": {
    "id": "prg_01j9zqk3q7m4n5p6r7s8t9v0wx",
    "name": "acme-report",
    "version": 3,
    "version_id": "pv_01j9zqk3q7m4n5p6r7s8t9v0wx"
  },
  "inputs_hash": "sha256:2b8f1c",
  "data": null,
  "raw": null,
  "warnings": [],
  "meta": {
    "tier": null,
    "tier_requested": "browser",
    "escalations": [],
    "region": "eu",
    "final_url": null,
    "cache": "miss",
    "duration_ms": 0,
    "parked_ms": 0
  },
  "error": null,
  "input_request": null,
  "attention": null,
  "progress": null,
  "tags": [
    "customer:42"
  ],
  "webhook_url": null,
  "created_at": "2026-09-18T10:00:00Z",
  "started_at": null,
  "finished_at": null,
  "expires_at": null
}
```

## Errors

Every error answers with the [error envelope](https://docs.kaab.ist/reference/api/schemas/error-response); its `code` is one of the [error codes](https://docs.kaab.ist/reference/codes#errors).

| Status | When |
|---|---|
| 400 | `request_invalid`: request validation failed |
| 401 | Missing or invalid API key |
| 403 | The key's scope does not cover this operation |
| 404 | Resource not found |
| 429 | Rate limited; see `Retry-After` |
| 500 | `internal`: unexpected server error |
