Skip to content

Cancel Subscription

POST
/api/Subscriptions/{id}/cancel
curl --request POST \
--url https://example.com/api/Subscriptions/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/cancel \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: example' \
--data '{ "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "merchantId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "reason": "example" }'

Cancels a subscription permanently. This cannot be undone. To re-enrol the member, create a new subscription. The matching subscription at the payment gateway is archived and any outstanding failed-payment retries are written off. Cancelling an already-cancelled subscription changes nothing and charges no cancellation fee.

id
required
string format: uuid

The subscription’s unique identifier.

Idempotency-Key
required
string
<= 255 characters

Required. A unique value (a UUID is ideal) per logical operation; reuse it when retrying that operation. A retry with the same key and body replays the original response instead of running twice. A 4xx frees the key, so the operation can be corrected and retried on it. A 5xx does not: the attempt may already have moved money, so retries with that key replay a problem+json saying the outcome is unknown, and a genuinely fresh attempt needs a new key. Missing → 400.

Optional cancellation reason.

object
id
string format: uuid
merchantId
string format: uuid
reason
string
nullable <= 500 characters
Example generated
{
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"merchantId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"reason": "example"
}

Subscription cancelled.

Media type application/json
object
id
string format: uuid
merchantId
string format: uuid
memberId
string format: uuid
memberName
string
nullable
planId
string format: uuid
planName
string
nullable
planFrequency
string
Allowed values: OneOff Daily Weekly Fortnightly Monthly Quarterly Yearly
planPrice
number format: double
paymentMethodId
string format: uuid
nullable
status
string
Allowed values: Trial Active PastDue Paused Cancelled
startDate
string format: date-time
trialEndsAt
string format: date-time
nullable
nextBillingDate
string format: date-time
nullable
nextBillingAmount
number format: double
nullable
pausedAt
string format: date-time
nullable
cancelledAt
string format: date-time
nullable
cancellationReason
string
nullable
createdAt
string format: date-time
updatedAt
string format: date-time
recentCycles
Array<object>
nullable
object
id
string format: uuid
periodStart
string format: date-time
periodEnd
string format: date-time
amount
number format: double
currency
string
nullable
status
string
Allowed values: Pending AwaitingSettlement Paid Failed WrittenOff OverCollected
attemptNumber
integer format: int32
nextActionAt
string format: date-time
nullable
lastDeclineCode
string
nullable
createdAt
string format: date-time
partnerRef
string
nullable
Example
{
"planFrequency": "OneOff",
"status": "Trial",
"recentCycles": [
{
"status": "Pending"
}
]
}

No subscription with the given ID exists.

Media type application/json
object
type
string
nullable
title
string
nullable
status
integer format: int32
nullable
detail
string
nullable
instance
string
nullable
key
additional properties
Example generated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

The early-cancellation fee was declined, or its outcome at the gateway isn’t known yet. The subscription is still active; the fee is on record and a retry won’t charge it twice.

Media type application/json
object
type
string
nullable
title
string
nullable
status
integer format: int32
nullable
detail
string
nullable
instance
string
nullable
key
additional properties
Example generated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}