---
search:
  tags:
    - Phases
    - POST
seo:
  description: >-
    Starts a bulk, cut, or maintenance phase and closes the open one. Omitted
    fields are filled in:… Reference for the POST /api/phases endpoint in the
    skcal API.
sidebar:
  label: Start a phase
  badge: POST
title: Start a phase
type: openapi-operation
---
Starts a bulk, cut, or maintenance phase and closes the open one. Omitted fields are filled in: start weight from the latest weigh-in, rate from the kind's default (+0.25% / -0.5% / 0% bodyweight per week), goal weight projected to the planned end, and daily calories from data-driven maintenance plus the rate's surplus or deficit. The phase's numbers are written to the caller's targets.

`POST /api/phases`

**Request body** (`application/json`, required)

The phase to start.

- `kind` (string) — Phase type; required to start a phase.
- `startDate` (string<date>) — First day of the phase (default today).
- `plannedEndDate` (string<date> | null) — Planned last day (YYYY-MM-DD); empty or null clears it.
- `goalWeightLb` (number | null) — Goal body weight in pounds (default the start weight projected over the planned length).
- `ratePctPerWeek` (number | null) — Planned weekly change as a percent of bodyweight; positive gains, negative loses.
- `dailyKcal` (integer | null) — Daily calorie target (default maintenance from logged data plus the rate's surplus or deficit).
- `proteinG` (integer | null) — Daily protein target in grams to set with the phase.
- `note` (string | null) — Free-text note, e.g. the reason for the phase.

Request body example:

```json
{
  "kind": "bulk",
  "startDate": "2026-10-24",
  "plannedEndDate": "2027-01-16",
  "goalWeightLb": 180,
  "ratePctPerWeek": 0.25,
  "dailyKcal": 2900,
  "proteinG": 180,
  "note": "lean bulk for the winter"
}
```

**Responses**

- `200` — The phase was started.
- `400` — The request body or parameters failed validation.

Response example, 200:

```json
{
  "ok": true,
  "phase": {
    "id": "3f2c1a9e-8b7d-4c6e-9f10-2a3b4c5d6e7f",
    "kind": "bulk",
    "startDate": "2026-10-24",
    "plannedEndDate": "2027-01-16",
    "endedDate": null,
    "active": true,
    "startWeightLb": 165.2,
    "goalWeightLb": 170.2,
    "ratePctPerWeek": 0.25,
    "dailyKcalTarget": 2900,
    "proteinTargetG": 180,
    "note": "lean bulk for the winter",
    "progress": {
      "weeksElapsed": 3.4,
      "weeksPlanned": 12,
      "latestWeightLb": 167.1,
      "changeLb": 1.9,
      "plannedLbPerWeek": 0.41,
      "actualLbPerWeek": 0.52,
      "actualPctPerWeek": 0.31,
      "status": "on_track"
    }
  },
  "closedPhaseId": null,
  "kcalSource": "estimated",
  "maintenanceKcal": 2650
}
```
