---
title: "Cancel Membership"
method: POST
path: "/memberships/{id}/cancel"
tags: ["Memberships"]
---

# Cancel Membership

`POST /memberships/{id}/cancel`

Cancels a membership. Pass `cancel_at_period_end: true` to stop auto-renewal and keep access until the current billing period ends. Omit it (or pass `false`) to revoke access immediately. Buyers cannot cancel buy-now-pay-later (`splitit`, `sezzle`) or non-trial split-pay memberships.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `cancel_at_period_end` boolean — `true` stops auto-renewal and keeps access until the current billing period ends. Omit or `false` revokes access immediately.
  - `reason` string — Free-form note recording why the membership was canceled.

## Response `200`

membership canceled

- Membership
  - `account` StorefrontAccount, required
    - `id` string, required — Account ID, prefixed `biz_`.
    - `logo_url` string, nullable, required — Account logo image URL. `null` when the account has not set one.
    - `route` string, required — Account public route identifier — the `whop.com/{route}` storefront path.
    - `title` string, required — Account display name.
  - `cancel_at_period_end` boolean, required — Whether the membership is set to cancel when the current billing period ends. Only meaningful for recurring plans.
  - `canceled_at` string, nullable, required — When cancellation was requested, or when the membership was canceled if no request time is recorded, as an ISO 8601 timestamp. `null` when neither is recorded.
  - `cancellation_reason` string, nullable, required — Free-text explanation provided when canceling. `null` when no reason was provided.
  - `created_at` string, required — When the membership was created, as an ISO 8601 timestamp.
  - `current_period_end` string, nullable, required — When the current billing period renews, or when a non-renewing membership expires, as an ISO 8601 timestamp. `null` for one-time purchases with no expiration.
  - `current_period_start` string, nullable, required — When the current billing period started, as an ISO 8601 timestamp. `null` when no billing period is recorded.
  - `id` string, required — Membership ID, prefixed `mem_`.
  - `license_key` string, nullable, required — The software license key for this membership. Only present when the product includes a software licensing experience.
  - `manage_url` string, nullable, required — URL where the buyer can sign in to manage billing. `null` without a member record or unless the caller is the buyer or has `member:manage` on the account.
  - `member` MembershipMember, required
    - `access_level` 'no_access' | 'admin' | 'customer', required — What the member can reach on the account: `customer` for paying members, `admin` for team members, `no_access` once every grant has lapsed.
    - `last_accessed_at` string, nullable, required — When the member last opened the account's content, as an ISO 8601 timestamp. `null` if they never have.
    - `position` number, nullable, required — The member's sort position in the buyer's own account list. `null` until they arrange it.
  - `metadata` object, required — Custom key-value pairs stored on the membership, commonly used for software licensing.
  - `phone_number` string, nullable, required — The buyer's phone number recorded for this membership, or `null`. The number collected (or verified) at checkout when the seller's phone collection is on; falls back to the buyer's account number when they have shared one with this seller.
  - `plan_id` string, required — The plan the buyer purchased, prefixed `plan_`.
  - `product_id` string, required — The product this membership grants access to, prefixed `prod_`.
  - `status` 'trialing' | 'active' | 'past_due' | 'completed' | 'canceled' | 'expired' | 'unresolved', required — Billing state of the membership. `active`/`trialing` memberships grant access; `past_due` is the grace period after a failed payment; `completed` one-time purchases keep access; `canceled`/`expired` do not.
  - `user_id` string, nullable, required — The buyer, prefixed `user_`. `null` when the buyer is another business or the membership is unclaimed.

## Other responses

- `403` — Forbidden
- `404` — Resource not found
- `409` — Conflict

## Changes

> 74 revisions in range; 1 not diffed.

- **2026-09-27** `78e1ed7366cd` — 2 info
  - the security scope `membership:cancel` was added to the endpoint's security scheme `bearerAuth`
  - the security scope `member:manage` was removed from the endpoint's security scheme `bearerAuth`
- **2026-09-26** `73dd0533cd81` — 2 info
  - the security scope `membership:cancel` was added to the endpoint's security scheme `bearerAuth`
  - the security scope `member:manage` was removed from the endpoint's security scheme `bearerAuth`
- **2026-09-25** `86b97292852d` — 6 info
  - the security scope `membership:cancel` was added to the endpoint's security scheme `bearerAuth`
  - the security scope `member:manage` was removed from the endpoint's security scheme `bearerAuth`
  - added the required property `canceled_at` to the response with the `200` status
  - added the required property `cancellation_reason` to the response with the `200` status
  - …2 more
- **2026-09-25** `c1dceb26e505` — 2 info
  - the security scope `membership:cancel` was added to the endpoint's security scheme `bearerAuth`
  - the security scope `member:manage` was removed from the endpoint's security scheme `bearerAuth`
- **2026-09-24** `7fcefabddb0a` — 2 info
  - the security scope `membership:cancel` was added to the endpoint's security scheme `bearerAuth`
  - the security scope `member:manage` was removed from the endpoint's security scheme `bearerAuth`

[Full history](https://skmtc.dev/whop/apis/whop-api/changes/memberships/:id/cancel/post.md)

---

[API](https://skmtc.dev/whop/apis/whop-api.md) · [All operations](https://skmtc.dev/whop/apis/whop-api/llms.txt) · [OpenAPI document](https://skmtc.dev/whop/apis/whop-api/revisions/78e1ed7366cd?raw)
