---
title: "Resolve a project's completion readiness"
method: GET
path: "/readiness/projects/{id}"
tags: ["readiness"]
---

# Resolve a project's completion readiness

`GET /readiness/projects/{id}`

## Request

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

Returns `{ projectId, projectType, transition, source, items, requiredGaps, hiddenItemCount, waivers, ready, mode, lastCheck }`. `mode` is the effective enforcement mode, `waivers` the active waivers (a waived item carries `waiverId` and is never a gap), `lastCheck` the latest recorded check or null. Applicability is decided live: active criteria for every project type plus those for this project's type. `auto` items carry `outcome` (pass | fail | unknown) and `detail`, recomputed on every call; `manual` and `ai` items carry their stored `status` (NOT_STARTED | IN_PROGRESS | DONE | NA), created on first read. Only a required, non-ai item that fails (auto) or is not DONE or NA (manual) is a gap; `unknown` never is. Any caller who can read the project.

## Path parameters

- `id` string, required

## Query parameters

- `transition` string

## Headers

- `X-Organization-Id` string, required

## Response `200`

Project readiness

## Other responses

- `400`: Validation error
- `401`: Unauthorized - missing or invalid JWT
- `404`: Project not found or not readable

---

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