---
title: "Billing Subscription Cancel"
method: POST
path: "/api/billing/subscription/cancel"
---

# Billing Subscription Cancel

`POST /api/billing/subscription/cancel`

Cancel renewal — claude/codex-style "stop my subscription".

No money moves: the current period continues working until
`expires_at`, at which point the hourly `expire_due_subscriptions`
cron demotes the user to community as it would have anyway. The
behavior change is purely UI:
  - `cancelled_at` gets a timestamp so the SPA can render the
    cancelled state ("已取消，<date> 到期后变为 Free") instead of
    the open-ended "active".
  - `auto_renew` is flipped FALSE for future-proofing (a hosted
    WeChat Pay 协议支付 / Alipay 周期扣款 product would gate on
    this).

Idempotent — cancelling a sub that is already cancelled is a
no-op and returns the same payload.

## Query parameters

- `domain` string

## Headers

- `authorization` string, nullable

## Response `200`

Successful Response

- object

## Other responses

- `422` — Validation Error

---

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