---
title: "Archive a project"
method: POST
path: "/readiness/projects/{id}/archive"
tags: ["readiness"]
---

# Archive a project

`POST /readiness/projects/{id}/archive`

## Request

- Base URL: `https://api.onplana.com/api`
- URL: `https://api.onplana.com/api/readiness/projects/{id}/archive`
- Auth: one of:
  - HTTP bearer
  - API key in header `Authorization`

The project Owner or Manager, or org.compliance.manage (403 otherwise). Only a COMPLETED or CANCELLED project (409 PROJECT_NOT_CLOSED); 409 ALREADY_ARCHIVED when it already is. Archive is a flag, not a status: the project keeps its status, is hidden from project lists by default, and refuses any status change (409 PROJECT_ARCHIVED) until unarchived. Runs the readiness gate with transition ARCHIVE under the organization's enforcement mode: in BLOCK a required gap answers 409 READINESS_GAPS `{ error, code, requiredGaps, checkId, transition }`; in WARN the archive goes through and `readiness` carries the verdict. Audited as PROJECT_ARCHIVED. Returns `{ projectId, status, archivedAt, archivedBy { id, name } | null, readiness { mode, passed, requiredGaps, checkId, transition } | null }`.

## Path parameters

- `id` string, required

## Headers

- `X-Organization-Id` string, required

## Response `200`

The archive state

## Other responses

- `400`: Validation error
- `401`: Unauthorized - missing or invalid JWT
- `403`: Forbidden - insufficient role
- `404`: Project not found or not readable
- `409`: PROJECT_NOT_CLOSED, ALREADY_ARCHIVED, READINESS_GAPS or ARCHIVE_CONFLICT

---

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