---
title: "Advance a print request through the farm lifecycle"
method: PATCH
path: "/api/prints/{id}"
tags: ["prints"]
---

# Advance a print request through the farm lifecycle

`PATCH /api/prints/{id}`

## Request

- Base URL: `https://www.immersivecommons.com`
- URL: `https://www.immersivecommons.com/api/prints/{id}`
- Auth: HTTP bearer

Clerk session or agt_ token with `prints:manage` (live tier re-checked, ic-member+) PLUS farm-manager identity — operator tier or the farm-crew allowlist. The scope alone NEVER authorizes a queue write. The requester is notified of the move. A submitter cancelling their own request uses POST /api/prints/{id}/cancel instead.

## Path parameters

- `id` string, required

## Request body

- PrintStatusPatchRequest
  - `status` 'accepted' | 'printing' | 'ready' | 'collected' | 'rejected', required: The target state. The transition table refuses moves that are illegal from the current status.
  - `note` string: Shown to the requester in the notification and kept on the history entry.

## Response `200`

The moved request.

- PrintRequestResponse
  - `ok` boolean, required
  - `request` PrintRequestPublic, required: A print request with the submitting token's sha256 stripped (lib/prints.ts::redactRequest). `history` is the full audit trail of moves.
    - `id` string, required: pj_*
    - `status` 'pending' | 'accepted' | 'printing' | 'ready' | 'collected' | 'rejected' | 'canceled', required
    - `title` string, required
    - `details` string
    - `material` string
    - `color` string
    - `quantity` integer
    - `file` object, nullable: Vault file holding the model, or null for a link-only ask.
    - `link_url` string, nullable: Hosted-model URL, or null.
    - `submitted_by` string, required: Clerk user id.
    - `submitted_by_name` string
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `history` object[], required
    - `slice_status` string: Auto-slice outcome. Absent means slicing was never attempted.

## Other responses

- `400`: Invalid JSON, unknown target status, or an illegal transition from the current state.
- `401`: No auth.
- `403`: Scope/tier not authorized, or the caller is not farm crew.
- `404`: No such request.

---

[API](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api.md) · [All operations](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api/revisions/be67c1f67c27?raw)
