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

# Cancel subscription

`POST /api/billing/cancel-subscription`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/billing/cancel-subscription`
- Auth: HTTP bearer

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Cancels your workspace's paid subscription. Only the workspace owner can cancel.

<Warning>This takes effect right away, with no confirmation step. By default the plan stops renewing: it stays active until the end of the billing period, then the workspace moves to the Free plan, and nothing is refunded. With `ils_refund_consent: true`, the paid plan ends immediately and part of the period is refunded, which can't be undone.</Warning>

Before the period ends, you can undo a default cancellation with [Reactivate subscription](/api-reference/reactivate-subscription), or with [Turn on auto-renew](/api-reference/turn-on-auto-renew) for a workspace billed through Wix.

**Immediate cancellation with a refund.** When [Preview ILS refund](/api-reference/preview-ils-refund) shows you're eligible, send `ils_refund_consent: true` to cancel right away and get part of the period back. The response then carries `ils_refund`. If an earlier immediate cancellation on this subscription refunded you but didn't finish, this call finishes it right away, even without consent.

<Warning>Check `ils_refund.status`. `refund_issued_cancel_failed` means you were refunded but the subscription is still active. Call this endpoint again to finish cancelling.</Warning>

**Apps over the Free plan's limit.** If [Get cancellation impact](/api-reference/get-cancellation-impact) shows `apps.over_limit: true`, send `cancellation_selection.keep_app_ids` to choose which apps stay published. When the plan ends, if the workspace is still over the limit, every other app is unpublished. Leave `cancellation_selection` out to unpublish nothing.

If a request fails after Base44 reached the payment provider, the cancellation may already have taken effect. Cancelling again is safe.

The base rate limit is 5 requests per hour per user. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

<Warning>Send only the fields documented here. Other request fields aren't supported and their behavior can change.</Warning>

## Request body

- CancelSubscriptionRequest: Details of the cancellation. Every field is optional.
  - `reason` string: Why you're cancelling, up to 100 characters. Saved with the cancellation.
  - `feedback` string: Anything else you want to tell Base44, up to 2,500 characters.
  - `missing_features_description` string: Features you were missing, up to 500 characters.
  - `ils_refund_consent` boolean: `true` to cancel right away and take the refund shown by [Preview ILS refund](/api-reference/preview-ils-refund). Ignored when that preview isn't eligible, except that a plan that stopped qualifying since returns 409. Defaults to `false`.
  - `cancellation_selection` object, nullable: Which apps stay published if the workspace is over the Free plan's app limit when the plan ends. Leave it out to unpublish nothing.
    - `keep_app_ids` string[]: IDs of the apps to keep published, from `apps.items[].id` in [Get cancellation impact](/api-reference/get-cancellation-impact). Only as many as the Free plan allows are kept, in the order you send them, and IDs of apps outside the workspace are ignored.

## Response `200`

The subscription is canceled, at the end of the period or right away.

- CancelSubscriptionResult: The outcome of a cancellation.
  - `success` boolean, required: Always `true`. A failure returns an error status instead.
  - `ils_refund` ImmediateRefund: The refund paid by an immediate cancellation.
    - `refund_agorot` integer, required: Amount refunded, in the smallest unit of `currency` (agorot for ILS, cents for USD).
    - `currency` string, required: Lowercase three-letter currency code of the refund.
    - `status` string, required: `issued`: refunded and canceled. `zero_refund`: canceled, with nothing left to refund. `pending_manual`: canceled, and Wix pays the refund. `refund_issued_cancel_failed`: refunded, but the subscription is still active. Call [Cancel subscription](/api-reference/cancel-subscription) again to finish cancelling.
    - `interval` string, nullable: Billing period of the canceled plan: `monthly` or `yearly`. Not returned when the workspace is billed through Wix.

## Other responses

- `400`: The workspace has no active subscription, or the immediate refund couldn't run. The message says why.
- `401`: Missing or invalid credentials. A read-only token gets this response too.
- `403`: You aren't the workspace owner.
- `409`: You sent `ils_refund_consent: true`, but the plan no longer qualifies for an immediate refund. Check [Preview ILS refund](/api-reference/preview-ils-refund) again.
- `422`: Validation Error
- `429`: Rate limit exceeded. The base rate limit is 5 requests per hour per user. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

## Changes

> 66 revisions in range; 1 not diffed.

- **2026-10-26** `395a6758864a`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/adexad/apis/base44-app-management-api/changes/api/billing/cancel-subscription/post.md)

---

[API](https://skmtc.dev/adexad/apis/base44-app-management-api.md) - [All operations](https://skmtc.dev/adexad/apis/base44-app-management-api/llms.txt) - [OpenAPI document](https://skmtc.dev/adexad/apis/base44-app-management-api/revisions/d877a932dc19?raw)
