---
title: "Cancel Subscription"
method: POST
path: "/billing/cancel"
tags: ["billing"]
---

# Cancel Subscription

`POST /billing/cancel`

Schedule the personal Pro subscription to end at the period boundary.

Idempotent: a subscription already set to end returns its boundary without
calling Dodo again. The reason is recorded here because the webhook that
follows sees the row already scheduled and does not record it twice.

## Request body

- CancelSubscriptionRequest — Body for POST /billing/cancel. ``reason`` is Dodo's feedback enum.
  - `reason` 'too_expensive' | 'missing_features' | 'switched_service' | 'unused' | 'customer_service' | 'low_quality' | 'too_complex' | 'other', required
  - `comment` string, nullable

## Response `200`

Successful Response

- CancelSubscriptionResponse
  - `cancel_at_period_end` boolean, required
  - `current_period_end` string, nullable

## Other responses

- `422` — Validation Error

## Changes

- **2026-09-26** `29a9df53f763` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/repowise/apis/repowise-hosted-api/changes/billing/cancel/post.md)

---

[API](https://skmtc.dev/repowise/apis/repowise-hosted-api.md) · [All operations](https://skmtc.dev/repowise/apis/repowise-hosted-api/llms.txt) · [OpenAPI document](https://skmtc.dev/repowise/apis/repowise-hosted-api/revisions/29a9df53f763?raw)
