---
title: "Terminate a subscription"
method: POST
path: "/subscriptions/{id}/terminate"
tags: ["Subscriptions"]
---

# Terminate a subscription

`POST /subscriptions/{id}/terminate`

Terminate a subscription. Three reasons are supported:

- `ORDINARY`: regular termination. `intended_end_at` is optional; when omitted, the plan's cancellation period applies.
- `MOVE_OUT`: special termination right tied to a move-out date. `intended_end_at` is mandatory and still has to leave the grid operator a few working days of notice.
- `WITHDRAWAL`: 14-day cooling-off period (Widerruf) after contract confirmation. The end date is calculated to comply with grid-operator notice periods.

All end dates in the request and response are **exclusive** midnight Europe/Berlin: from that moment the customer is no longer supplied. The customer's last day of supply is the day before the named date.

Every termination reason has to clear the grid operator's working-day notice; ORDINARY additionally has to respect the plan's cancellation period.

Conflict responses (`409`) carry a dedicated `errors[].code`:
- `invalid_termination_date` — the requested date is in the past or violates the plan's / grid operator's notice period.
- `withdrawal_not_allowed` — the 14-day withdrawal window has elapsed (or the subscription has no confirmed_at to count from).

## Path parameters

- `id` string, required

## Request body

- union
  - object
    - `reason` 'ORDINARY', required
    - `intended_end_at` string, date-time — Optional exclusive end timestamp. Must be exactly midnight Europe/Berlin (any zone offset accepted as long as the instant is 00:00 Berlin). From that moment the customer is no longer supplied; the last day of supply is the day before. When omitted, the plan's cancellation period applies.
  - object
    - `reason` 'MOVE_OUT', required
    - `intended_end_at` string, date-time, required — Exclusive end timestamp for the move-out. Must be exactly midnight Europe/Berlin (any zone offset accepted as long as the instant is 00:00 Berlin). Mandatory for `MOVE_OUT`. Must respect the grid operator's working-day notice.
  - object
    - `reason` 'WITHDRAWAL', required

## Response `200`

The subscription's termination details

- TerminateSubscriptionResponse
  - `reason` 'ORDINARY' | 'MOVE_OUT' | 'WITHDRAWAL', required
  - `intended_end_at` string, date-time, required — Customer-provided or system-calculated exclusive end timestamp at midnight Europe/Berlin. From this instant the customer is no longer supplied.

## Other responses

- `400` — The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
- `401` — The client must authenticate itself to get the requested response.
- `402` — A higher pricing plan is required to access the resource.
- `403` — The client does not have the necessary permissions to access the resource.
- `404` — The server can't find the requested resource.
- `405` — The request method is not allowed.
- `409` — The request could not be completed due to a conflict mainly due to unique constraints.
- `422` — The request was well-formed but was unable to be followed due to semantic errors.
- `429` — The client has sent too many requests.
- `500` — The server has encountered a situation it doesn't know how to handle.

---

[API](https://skmtc.dev/nomos/apis/nomos-api.md) · [All operations](https://skmtc.dev/nomos/apis/nomos-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/nomos/nomos-api/revisions/da60ad83e92f/schema)
