---
title: "Read a project's plan back as the JSON sync-plan accepts"
method: GET
path: "/board/plan"
tags: ["Internal"]
---

# Read a project's plan back as the JSON sync-plan accepts

`GET /board/plan`

## Request

- Base URL: `https://api.apphandoff.com/api`
- URL: `https://api.apphandoff.com/api/board/plan`
- Auth: API key in cookie `sb-access-token`

With `plan_key`, returns `{ plan }` — the plan document (program, milestones, tickets) rebuilt from the live board, in exactly the shape `POST /board/sync-plan` takes, so a second edit is GET → change one ticket → POST. Stage, status and progress are excluded by design. Without `plan_key`, returns `{ plans }`: every plan key on the project with its program name and live milestone/ticket counts. Archived milestones and tickets are excluded from both.

## Query parameters

- `project_id` string, uuid, required
- `plan_key` string

## Response `200`

The plan document, or the project's plan listing

- union
  - object
    - `plan` object, required: Plan document — the same shape sync-plan accepts.
  - object
    - `plans` object[], required
      - `plan_key` string, required
      - `program_name` string, nullable, required
      - `milestone_count` integer, required
      - `ticket_count` integer, required

## Other responses

- `400`: Invalid request
- `401`: Not authenticated
- `403`: Forbidden
- `404`: No plan with that key on this project
- `429`: Rate limited

---

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