---
title: "Fetch a single async-job record"
method: GET
path: "/v1/jobs/{jobId}"
tags: ["Jobs"]
---

# Fetch a single async-job record

`GET /v1/jobs/{jobId}`

## Request

- Base URL: `http://localhost:9998`
- URL: `http://localhost:9998/v1/jobs/{jobId}`
- Auth: HTTP bearer

Returns the `WireJobRecord` for `jobId`, or 404 if no such job exists.
The record carries the job's lifecycle `state`, `progress` percent, and
— once `completed` — the `outputAssetId` whose bytes resolve
by-reference through the Asset read surface.

## Path parameters

- `jobId` string, required

## Response `200`

Job record

- WireJobRecord
  - `id` string, required: Stable job identifier (returned when the job was enqueued).
  - `verb` string, required: The async verb this job runs (e.g. the transform/capture name).
  - `state` 'pending' | 'running' | 'completed' | 'failed' | 'cancelled', required: Lifecycle state of an async job.
  - `progress` number, double, required: Completion percent (0–100).
  - `startedAt` string, required: ISO-8601 timestamp when the job started.
  - `finishedAt` string, nullable: ISO-8601 timestamp when the job reached a terminal state; null while running.
  - `error` string, nullable: Failure message when `state` is `failed`; null otherwise.
  - `outputAssetId` string, nullable: Asset id of the produced output when `state` is `completed`; null otherwise.

## Other responses

- `400`: Invalid request
- `404`: Resource not found
- `503`: Job store unavailable

---

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