# Endpoint: Отмена подписки в конце периода

:::info
**С 1 ноября 2026 запрос без заголовка** `**X-Partner-Api-Key**` **перестанет работать.**

Мы добавили в эту ручку проверку владельца подписки: она сверяет, что подписка относится к вашему аккаунту. Чтобы проверка работала для ваших запросов, передавайте заголовок с вашим ключом — см. раздел «Заголовки» ниже.

Подключить заголовок можно уже сейчас, ждать 1 ноября не нужно.

:::

## Когда использовать этот метод

Этот метод подходит для **стандартного сценария отмены подписки**, когда пользователь хочет прекратить автоматическое продление, но использовать уже оплаченный период до конца.

**Преимущества:**

* Пользователь сохраняет доступ к сервису до конца оплаченного периода
* Пользователь не теряет деньги за неиспользованное время
* Пользователь может передумать и возобновить подписку до окончания периода


---

Для сравнения: **Немедленная отмена подписки** — если нужно отменить подписку прямо сейчас с немедленным прекращением доступа.


---

## Описание

Этот endpoint позволяет запланировать отмену подписки пользователя в конце текущего оплаченного периода или отменить ранее запланированную отмену.

### Интеграция с Stripe API

Под капотом мы используем метод [Update a subscription](https://docs.stripe.com/api/subscriptions/update) из Stripe API, обновляя поле [`cancel_at_period_end`](https://docs.stripe.com/api/subscriptions/update#update_subscription-cancel_at_period_end).

Это стандартный способ управления запланированной отменой подписок в Stripe, который обеспечивает корректную обработку биллинга и сохранение доступа пользователя до конца оплаченного периода.

## URL

```
POST https://n8n.thenextgen.store/webhook/cancel_subscription_at_period_end
```

## Параметры запроса

### Заголовки

* **X-Partner-Api-Key** — ваш ключ EasyPay. Обязателен с 1 ноября 2026; подключить рекомендуем заранее. Ключ лежит в личном кабинете: раздел **API key and MCP Setup** → кнопка **Show key**.

### Query параметры (обязательные)

* **subscription_id** — ID подписки Stripe (например: `sub_1SlxDHLoVAqE08foQiRVDkfy`)

### Body параметры (form-data)

* **cancel_at_period_end** — булево значение (`true` / `false`)
  * `true` — запланировать отмену подписки в конце текущего периода
  * `false` — отменить запланированную отмену, подписка продолжит действовать

## Пример запроса

### Запланировать отмену подписки

```http
POST /webhook/cancel_subscription_at_period_end?subscription_id=sub_1SlxDHLoVAqE08foQiRVDkfy
X-Partner-Api-Key: <ваш ключ>
Content-Type: application/x-www-form-urlencoded

cancel_at_period_end=true
```

### Отменить запланированную отмену

```http
POST /webhook/cancel_subscription_at_period_end?subscription_id=sub_1SlxDHLoVAqE08foQiRVDkfy
X-Partner-Api-Key: <ваш ключ>
Content-Type: application/x-www-form-urlencoded

cancel_at_period_end=false
```

## Пример ответа

```json
{
  "application_fee_percent": null,
  "automatic_tax": {
    "disabled_reason": null,
    "enabled": false,
    "liability": null
  },
  "billing_cycle_anchor": 1767585821,
  "billing_cycle_anchor_config": null,
  "billing_mode": {
    "flexible": null,
    "type": "classic"
  },
  "billing_thresholds": null,
  "cancel_at": 1770234221,
  "cancel_at_period_end": true,
  // ... остальные поля подписки Stripe
}
```

## Логика работы

### При `cancel_at_period_end=true`:

* Подписка остаётся активной до конца текущего оплаченного периода
* Пользователь сохраняет доступ к сервису до даты окончания периода
* Автоматическое продление отключается
* В Stripe устанавливается флаг `cancel_at_period_end: true`
* Поле `cancel_at` содержит timestamp даты окончания подписки

### При `cancel_at_period_end=false`:

* Отменяется ранее запланированная отмена
* Подписка продолжит автоматически продлеваться
* В Stripe флаг `cancel_at_period_end` сбрасывается в `false`
* Поле `cancel_at` становится `null`

## Ошибки

| Код | Что значит | Что делать |
|-----|------------|------------|
| `400` | `subscription_id` отсутствует или не похож на `sub_…` | проверьте параметр запроса |
| `401` | ключ не распознан или не передан | сверьте `X-Partner-Api-Key`, ключ копируется целиком |
| `403` | подписка принадлежит другому аккаунту | проверьте `subscription_id`; если уверены, что подписка ваша — напишите команде заботы |
| `409` | подписку мы ещё не видим у себя | так бывает в первые секунды после её создания — повторите через минуту |

## Важные замечания

* ✅ Подписка должна существовать и быть активной
* ✅ `subscription_id` должен быть валидным ID из Stripe
* ✅ Изменения применяются немедленно
* ⚠️ При `cancel_at_period_end=true` пользователь сохраняет доступ до конца периода
* ⚠️ Этот метод **не отменяет подписку немедленно** — для немедленной отмены используйте другой endpoint