> ## Documentation Index
> Fetch the complete documentation index at: https://docs.llmgenerator.com/llms.txt
> Use this file to discover all available pages before exploring further.

# サブスクの解約

> 現在の請求期間終了時に自動更新しないよう、ユーザーのサブスクを解約予約します。

## 概要

サブスクを解約します。実際のアクセス権は請求期間の終わりまで維持され、自動更新のみ停止されます。セッション認証（JWT アクセストークン）が必要です。

<Note>
  **サードパーティ連携:** API キー認証で `POST /subscriptions/cancel/api` を利用してください。
</Note>

<Warning>
  この操作は期間末での解約を予約します。`currentPeriodEnd` まではサービスは利用できます。即時停止が必要な場合は Billing Portal を利用してください。
</Warning>

## 認証

<ParamField header="Authorization" type="string" required>
  JWT アクセストークン。形式: `Bearer YOUR_ACCESS_TOKEN`
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://api.llmgenerator.com/api/v1/subscriptions/cancel \
    -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://api.llmgenerator.com/api/v1/subscriptions/cancel', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
    }
  });

  const data = await response.json();
  if (data.success) {
    console.log('Subscription will end on:', data.cancellationDate);
  }
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://api.llmgenerator.com/api/v1/subscriptions/cancel',
      headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}
  )
  data = response.json()
  if data['success']:
      print(f"Subscription will end on: {data['cancellationDate']}")
  ```
</RequestExample>

<ResponseExample>
  ```json 成功 theme={null}
  {
    "success": true,
    "message": "Subscription cancelled successfully",
    "cancellationDate": "2024-02-15T00:00:00Z"
  }
  ```

  ```json アクティブな契約なし theme={null}
  {
    "message": "No active subscription to cancel"
  }
  ```
</ResponseExample>

## レスポンスフィールド

<ResponseField name="success" type="boolean">
  解約予約が成功したかどうか。
</ResponseField>

<ResponseField name="message" type="string">
  読みやすいステータスメッセージ。
</ResponseField>

<ResponseField name="cancellationDate" type="string">
  サブスクが終了する日時の ISO 8601（成功時のみ）。
</ResponseField>

## エラーレスポンス

<ResponseField name="400">
  不正なリクエスト — キャンセル対象のアクティブ契約がない、または API 経由での解約ができない状態です。
</ResponseField>

<ResponseField name="401">
  未認証 — トークンが無効または未指定です。
</ResponseField>

## 解約時の動作

| 状況                  | 挙動                 |
| ------------------- | ------------------ |
| アクティブな契約がある         | 期間末で解約予約となる        |
| 既に解約済み              | エラーを返す             |
| 契約がない               | エラーを返す             |
| Stripe のサブスク ID がない | エラー（API ではキャンセル不可） |

## 再開

再開またはプラン変更は次から行えます。

1. Billing Portal（`/subscriptions/portal`）
2. または現在の契約終了後に新規契約

## 運用上のヒント

* **確認ダイアログ**: キャンセル前に必ず確認する
* **理由の収集**: フィードバックのため離脱理由を聞く
* **離脱防止**: 割引や一時停止の案内を検討する
* **明確な表示**: アクセス権がいつ終わるかを明示する

***

## POST /subscriptions/cancel/api

API キー認証でサブスクを解約します。サードパーティ連携向けです。

### 認証

API キー認証が必要です。`Authorization` ヘッダーに API キーを付与します。

```
Authorization: Bearer llmgen_your_api_key_here
```

### レスポンス

`/subscriptions/cancel` と同一です。

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://api.llmgenerator.com/api/v1/subscriptions/cancel/api \
    -H "Authorization: Bearer llmgen_your_api_key_here"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://api.llmgenerator.com/api/v1/subscriptions/cancel/api', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer llmgen_your_api_key_here'
    }
  });

  const data = await response.json();
  if (data.success) {
    console.log('Subscription will end on:', data.cancellationDate);
  }
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://api.llmgenerator.com/api/v1/subscriptions/cancel/api',
      headers={'Authorization': 'Bearer llmgen_your_api_key_here'}
  )
  data = response.json()
  if data['success']:
      print(f"Subscription will end on: {data['cancellationDate']}")
  ```
</RequestExample>
