---
title: "List async-job records"
method: GET
path: "/v1/jobs"
tags: ["Jobs"]
---

# List async-job records

`GET /v1/jobs`

## Request

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

Returns every `WireJobRecord` held by the in-memory `JobStore` — the
read side of the shared async-job substrate (chat-to-feature foundation
Phase 2). Long-running verbs (image/video transforms, SERP captures)
return a `{ jobId }` immediately and run off the request; a consumer
polls this list (or `GET /v1/jobs/{jobId}`) for state and progress. Job
progress is also pushed over the SSE seam (`GET /v1/events`) as
`job.progress` / `job.complete` events.

## Response `200`

Job records

- WireJobListResponse
  - `jobs` WireJobRecord[], required
    - `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

- `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)
