---
title: "List jobs for the tenant, newest first. Secret key only. Paged: pass `limit` (1–100, default 25), optional `status`, and `cursor` from the previous page's `next_cursor` (null on the last page; a bad cursor is a 400)."
method: GET
path: "/jobs"
---

# List jobs for the tenant, newest first. Secret key only. Paged: pass \`limit\` (1–100, default 25), optional \`status\`, and \`cursor\` from the previous page's \`next_cursor\` (null on the last page; a bad cursor is a 400).

`GET /jobs`

## Request

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

## Query parameters

- `limit` integer
- `status` 'created' | 'uploading' | 'uploaded' | 'queued' | 'processing' | 'complete' | 'quoted' | 'booked_requested' | 'booked' | 'declined' | 'error': Funnel order. **created** — The job exists. Nothing uploaded yet. **uploading** — An upload URL was issued; the video is on its way. **uploaded** — A chunked upload was assembled (a single PUT skips this state). **queued** — POST /submit accepted; waiting its turn to be analysed. **processing** — The walkthrough is being analysed. Poll GET /jobs/{id}; typically 1–4 minutes. **complete** — Inventory ready. The firm quote is computed on the first read. **quoted** — A firm, bookable quote exists (set by the first GET after complete). **booked_requested** — The customer asked to book; the mover has not answered yet. **booked** — The mover confirmed the booking. **declined** — The mover turned the request down. `decline_reason` may say why. **error** — Analysis failed. `error` carries a message; upload again or contact the mover.
- `cursor` string

## Response `200`

One page of jobs

- object
  - `jobs` JobSummary[]
    - `id` string: ULID
    - `status` 'created' | 'uploading' | 'uploaded' | 'queued' | 'processing' | 'complete' | 'quoted' | 'booked_requested' | 'booked' | 'declined' | 'error': Funnel order. **created** — The job exists. Nothing uploaded yet. **uploading** — An upload URL was issued; the video is on its way. **uploaded** — A chunked upload was assembled (a single PUT skips this state). **queued** — POST /submit accepted; waiting its turn to be analysed. **processing** — The walkthrough is being analysed. Poll GET /jobs/{id}; typically 1–4 minutes. **complete** — Inventory ready. The firm quote is computed on the first read. **quoted** — A firm, bookable quote exists (set by the first GET after complete). **booked_requested** — The customer asked to book; the mover has not answered yet. **booked** — The mover confirmed the booking. **declined** — The mover turned the request down. `decline_reason` may say why. **error** — Analysis failed. `error` carries a message; upload again or contact the mover.
    - `move_date` string, date, nullable: YYYY-MM-DD
    - `total_cuft` number, nullable
    - `quote_total_cents` integer, nullable: The firm price, once one exists, in integer cents. Currency travels beside it — never assume USD.
    - `quote_currency` string, nullable
    - `outcome_captured_at` string, date-time, nullable
    - `created_at` string, date-time
    - `customer_name` string, nullable
    - `customer_email` string, nullable
    - `customer_phone` string, nullable
  - `limit` integer
  - `next_cursor` string, nullable: Pass back as `cursor` for the next page; null when there is none.

## Other responses

- `400`: `invalid_request` — A field is missing, malformed or not allowed in this state. `message` says which. `secret_key_in_url` — A secret key was sent as `?k=`. Secret keys go in the Authorization header only.
- `401`: `unauthorized` — No key, an unknown key, or a revoked key.
- `403`: `secret_key_required` — The endpoint is server-only; a publishable key cannot reach it. `insufficient_scope` — The key does not carry the scope this call needs (named in `message`). Mint one that does from the keys page or POST /keys. `key_rotated` — The calling key has been rotated and is in its grace period: it still serves jobs and quotes, but key management and the delivery log belong to its replacement. `mode_mismatch` — A test key tried to manage a live key. Live keys manage both modes; test keys manage test keys only.
- `429`: `rate_limited` — Per-key limit (60/min publishable, 300/min secret), the mover's daily ballpark or video-analysis cap, or a visitor's daily catalog-search cap. Obey `Retry-After`. Carries `Retry-After` in seconds.

---

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