---
title: "List jobs"
method: GET
path: "/api/v1/jobs"
tags: ["Jobs"]
---

# List jobs

`GET /api/v1/jobs`

## Request

- Base URL: `https://beyourcover.com`
- URL: `https://beyourcover.com/api/v1/jobs`
- Auth: HTTP bearer

Lists the subscription's jobs, newest first, with optional status/operation/source filters and keyset cursor pagination. The list also holds the jobs the web app records when a workspace member spends credits there (`source: "web"`, for example `edit_font`, `marketing_resource` or `wrap_cover_generate`): they draw on the same credit balance. Result payloads are omitted — poll `GET /api/v1/jobs/{jobId}` for signed cover URLs.

## Query parameters

- `status` 'queued' | 'processing' | 'completed' | 'failed'
- `operation` 'generate' | 'variation' | 'edit_image' | 'upscale' | 'audiobook_cover' | 'remove_text' | 'generate_reference' | 'wrap' | 'wrap_extend_front' | 'generate_single' | 'edit_font' | 'convert_style' | 'layerize_text' | 'remove_text_variants' | 'audiobook_generate' | 'marketing_resource' | 'kit_regeneration' | 'brand_kit_extract' | 'series_next_book' | 'wrap_cover_generate' | 'wrap_cover_regenerate' | 'audiobook_upscale' | 'refine_cover' | 'wrap_back_cover_generate' | 'wrap_cover_export'
- `source` 'api' | 'web'
- `limit` integer
- `cursor` string

## Response `200`

One page of jobs.

- JobList
  - `jobs` JobSummary[], required: Newest first. Result payloads are omitted — poll `GET /api/v1/jobs/{jobId}` for signed cover URLs.
    - `jobId` string, uuid, required
    - `status` 'queued' | 'processing' | 'completed' | 'failed', required
    - `operation` 'generate' | 'variation' | 'edit_image' | 'upscale' | 'audiobook_cover' | 'remove_text' | 'generate_reference' | 'wrap' | 'wrap_extend_front' | 'generate_single' | 'edit_font' | 'convert_style' | 'layerize_text' | 'remove_text_variants' | 'audiobook_generate' | 'marketing_resource' | 'kit_regeneration' | 'brand_kit_extract' | 'series_next_book' | 'wrap_cover_generate' | 'wrap_cover_regenerate' | 'audiobook_upscale' | 'refine_cover' | 'wrap_back_cover_generate' | 'wrap_cover_export', required
    - `source` 'api' | 'web', required: `api`: started through this API or the MCP server. `web`: recorded by the web app when a workspace member spent credits there; its output stays in the app.
    - `external_ref` string, nullable
    - `credits_used` integer, nullable
    - `bookId` string, uuid, nullable
    - `error` string, nullable: Failure message when status is `failed`.
    - `created_at` string, date-time, required
    - `started_at` string, date-time, nullable
    - `completed_at` string, date-time, nullable
    - `poll_url` string, required: Path of the job detail endpoint (result payloads with signed URLs live there, not in this list).
  - `next_cursor` string, nullable, required: Pass as `cursor` to fetch the next page. `null` when there are no more results.

## Other responses

- `400`: `code` is one of: `invalid_status_filter`, `invalid_operation_filter`, `invalid_source_filter`, `invalid_limit`, `invalid_cursor`.
- `401`: Missing/malformed API key, unknown or inactive key, or inactive subscription detected during credit checks. `code`: `unauthorized`.
- `403`: The API key is valid but its owner has no active enterprise subscription. `code`: `forbidden`.
- `500`: Server error. `code` is `fetch_failed` or `internal_error`.

---

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