---
title: "Delete one of the clinic's programs."
method: DELETE
path: "/api/v1/programs/{id}"
tags: ["Programs"]
---

# Delete one of the clinic's programs.

`DELETE /api/v1/programs/{id}`

## Request

- Base URL: `https://api-dev.fusehealth.com`
- URL: `https://api-dev.fusehealth.com/api/v1/programs/{id}`
- Auth: API key in header `x-api-key`

Delete one of the clinic's programs.

Removes the program outright only when nothing is in flight. If work
remains (active orders, enrollments) the program is *retired* instead:
it stops being offered to new patients, while patients already on it
continue their treatment. A retired program is removed once all of its
in-flight work has finished; note that a patient who keeps renewing has
no natural end, so do not build automation that assumes the program will
disappear on its own.

**Returns 409 `WINDDOWN_CONSENT_REQUIRED` when the program still has
patients on it.** This endpoint carries no wind-down opt-in,
so it can only retire passively — which for an enrolled program means
the patients are never told and their subscriptions keep billing, so it
is refused rather than done silently.

**Ending a program that still has patients is not currently available
over this API.** The wind-down opt-in
(`POST /programs/{id}/retire-with-winddown`) is exposed only on the
authenticated brand-admin portal, not on this API-key surface — a
deliberate limit, because it emails patients and cancels their
subscriptions. Use the brand admin portal for that action. Over this
API, `deactivate` stops the program being offered to new patients but
does not stop billing anyone already enrolled.

## Path parameters

- `id` string, required

## Response `200`

Success

- object
  - `success` boolean
  - `message` string
  - `data` Program: Program.toJSON plus derived links and ClinicProgram overrides.
    - `id` string, uuid
    - `name` string
    - `description` string, nullable
    - `isActive` boolean
    - `isFeatured` boolean
    - `nonMedicalServiceFee` number
    - `heroImageUrl` string, nullable
    - `customSlug` string, nullable
    - `accentColor` string, nullable
    - `sellableProductCount` integer
    - `unpricedProductCount` integer
    - `programGlobalProducts` ProgramGlobalProduct[]
      - `id` string, uuid
      - `displayOrder` integer
      - `isPatientVisible` boolean
      - `globalProduct` object

## Other responses

- `401`: Missing, invalid, inactive, or expired API key (or JWT)
- `403`: Authenticated but not permitted (insufficient scope, wrong role, or FUSE feature not enabled)
- `404`: Resource not found (or not owned by the key's clinic)
- `409`: The program still has patients on it. Ending it requires the explicit wind-down opt-in — see `POST /programs/{id}/retire-with-winddown`.

---

[API](https://skmtc.dev/fusehealth/apis/fuse-brand-api-external.md) · [All operations](https://skmtc.dev/fusehealth/apis/fuse-brand-api-external/llms.txt) · [OpenAPI document](https://skmtc.dev/fusehealth/apis/fuse-brand-api-external/revisions/50821832728c?raw)
