curl --request POST \
--url https://app.base44.com/api/billing/cancel-subscription \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "",
"feedback": "",
"missing_features_description": "",
"ils_refund_consent": false
}
'import requests
url = "https://app.base44.com/api/billing/cancel-subscription"
payload = {
"reason": "",
"feedback": "",
"missing_features_description": "",
"ils_refund_consent": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
reason: '',
feedback: '',
missing_features_description: '',
ils_refund_consent: false
})
};
fetch('https://app.base44.com/api/billing/cancel-subscription', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.base44.com/api/billing/cancel-subscription",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'reason' => '',
'feedback' => '',
'missing_features_description' => '',
'ils_refund_consent' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/billing/cancel-subscription"
payload := strings.NewReader("{\n \"reason\": \"\",\n \"feedback\": \"\",\n \"missing_features_description\": \"\",\n \"ils_refund_consent\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.base44.com/api/billing/cancel-subscription")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"\",\n \"feedback\": \"\",\n \"missing_features_description\": \"\",\n \"ils_refund_consent\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/billing/cancel-subscription")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"\",\n \"feedback\": \"\",\n \"missing_features_description\": \"\",\n \"ils_refund_consent\": false\n}"
response = http.request(request)
puts response.read_body{
"success": true
}{
"detail": [
{
"type": "bool_parsing",
"loc": [
"body",
"ils_refund_consent"
],
"msg": "Input should be a valid boolean, unable to interpret input",
"input": "maybe"
}
]
}Cancel subscription
Cancels your workspace’s paid subscription. Only the workspace owner can cancel.
ils_refund_consent: true, the paid plan ends immediately and part of the period is refunded, which can’t be undone.Before the period ends, you can undo a default cancellation with Reactivate subscription, or with Turn on auto-renew for a workspace billed through Wix.
Immediate cancellation with a refund. When 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.
ils_refund.status. refund_issued_cancel_failed means you were refunded but the subscription is still active. Call this endpoint again to finish cancelling.Apps over the Free plan’s limit. If 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 for the multiplier your plan gets.
curl --request POST \
--url https://app.base44.com/api/billing/cancel-subscription \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "",
"feedback": "",
"missing_features_description": "",
"ils_refund_consent": false
}
'import requests
url = "https://app.base44.com/api/billing/cancel-subscription"
payload = {
"reason": "",
"feedback": "",
"missing_features_description": "",
"ils_refund_consent": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
reason: '',
feedback: '',
missing_features_description: '',
ils_refund_consent: false
})
};
fetch('https://app.base44.com/api/billing/cancel-subscription', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.base44.com/api/billing/cancel-subscription",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'reason' => '',
'feedback' => '',
'missing_features_description' => '',
'ils_refund_consent' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/billing/cancel-subscription"
payload := strings.NewReader("{\n \"reason\": \"\",\n \"feedback\": \"\",\n \"missing_features_description\": \"\",\n \"ils_refund_consent\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.base44.com/api/billing/cancel-subscription")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"\",\n \"feedback\": \"\",\n \"missing_features_description\": \"\",\n \"ils_refund_consent\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/billing/cancel-subscription")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"\",\n \"feedback\": \"\",\n \"missing_features_description\": \"\",\n \"ils_refund_consent\": false\n}"
response = http.request(request)
puts response.read_body{
"success": true
}{
"detail": [
{
"type": "bool_parsing",
"loc": [
"body",
"ils_refund_consent"
],
"msg": "Input should be a valid boolean, unable to interpret input",
"input": "maybe"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>. Each operation lists the permission it needs: read_only or full_access. A full-access token can call every operation. A read-only token can call only the operations that list read_only; anything else returns 403 read_only_credential_route_not_allowed.
Body
Details of the cancellation. Every field is optional.
Why you're cancelling, up to 100 characters. Saved with the cancellation.
100"Too expensive"
Anything else you want to tell Base44, up to 2,500 characters.
2500"We only needed it for one launch."
Features you were missing, up to 500 characters.
500"A Salesforce connector."
true to cancel right away and take the refund shown by Preview ILS refund. Ignored when that preview isn't eligible, except that a plan that stopped qualifying since returns 409. Defaults to false.
false
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.
Show child attributes
Show child attributes
{ "keep_app_ids": ["6820f3a4e7b91d003c45a1f2"] }
Response
The subscription is canceled, at the end of the period or right away.
Was this page helpful?