Change subscription plan
POST
/api/apps/{appId}/change-plan
Switches the app's subscription between monthly and yearly plans.
Stripe prorates the charge automatically. Cannot be used while
cancellation is pending — reactivate first.
Parameters
Name
Type
Description
appIdrequired
string
The app's unique identifier
Example:
-NtestApp123
Request Body
Name
Type
Description
planrequired
string
New billing plan to switch to
monthlyyearly
Responses
200
Plan changed
Name
Type
Description
planType
string
monthlyyearly
currentPeriodEnd
integer
Unix timestamp of the current billing period end
400
No active subscription, cancellation pending, or already on requested plan
Name
Type
Description
errorrequired
object
coderequired
string
Machine-readable error code
UNAUTHORIZEDFORBIDDENNOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDSLUG_TAKENSLUG_RESERVEDDOMAIN_IN_USEAPP_LIMIT_REACHEDSUBSCRIPTION_REQUIREDSUBSCRIPTION_EXISTSNO_PAYMENT_METHODNO_ACTIVE_SUBSCRIPTIONNOT_CANCELINGALREADY_CANCELINGSUBSCRIPTION_CANCELINGSAME_PLANCARD_ERRORPAYMENT_ERRORNO_STRIPE_CUSTOMERCERT_CREATION_FAILEDDEPLOY_FAILEDAPI_KEY_LIMIT_REACHEDINVALID_IDEMPOTENCY_KEYIDEMPOTENCY_KEY_REUSEINTERNAL_ERROR
messagerequired
string
Human-readable error description
docUrl
string (uri)
Link to relevant API documentation for this error
Example:
https://orbitkit.io/api/errors/#unauthorized
details
object[]
Additional validation details (Zod errors)
401
Missing, invalid, or expired authentication token
Name
Type
Description
errorrequired
object
coderequired
string
Machine-readable error code
UNAUTHORIZEDFORBIDDENNOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDSLUG_TAKENSLUG_RESERVEDDOMAIN_IN_USEAPP_LIMIT_REACHEDSUBSCRIPTION_REQUIREDSUBSCRIPTION_EXISTSNO_PAYMENT_METHODNO_ACTIVE_SUBSCRIPTIONNOT_CANCELINGALREADY_CANCELINGSUBSCRIPTION_CANCELINGSAME_PLANCARD_ERRORPAYMENT_ERRORNO_STRIPE_CUSTOMERCERT_CREATION_FAILEDDEPLOY_FAILEDAPI_KEY_LIMIT_REACHEDINVALID_IDEMPOTENCY_KEYIDEMPOTENCY_KEY_REUSEINTERNAL_ERROR
messagerequired
string
Human-readable error description
docUrl
string (uri)
Link to relevant API documentation for this error
Example:
https://orbitkit.io/api/errors/#unauthorized
details
object[]
Additional validation details (Zod errors)
404
Resource not found
Name
Type
Description
errorrequired
object
coderequired
string
Machine-readable error code
UNAUTHORIZEDFORBIDDENNOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDSLUG_TAKENSLUG_RESERVEDDOMAIN_IN_USEAPP_LIMIT_REACHEDSUBSCRIPTION_REQUIREDSUBSCRIPTION_EXISTSNO_PAYMENT_METHODNO_ACTIVE_SUBSCRIPTIONNOT_CANCELINGALREADY_CANCELINGSUBSCRIPTION_CANCELINGSAME_PLANCARD_ERRORPAYMENT_ERRORNO_STRIPE_CUSTOMERCERT_CREATION_FAILEDDEPLOY_FAILEDAPI_KEY_LIMIT_REACHEDINVALID_IDEMPOTENCY_KEYIDEMPOTENCY_KEY_REUSEINTERNAL_ERROR
messagerequired
string
Human-readable error description
docUrl
string (uri)
Link to relevant API documentation for this error
Example:
https://orbitkit.io/api/errors/#unauthorized
details
object[]
Additional validation details (Zod errors)
Language
URL
POST
https://api.orbitkit.io/api/apps/{appId}/change-plan
curl -X POST "https://api.orbitkit.io/api/apps/-NtestApp123/change-plan" \
-H "Authorization: Bearer $ORBITKIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"plan":"monthly"}'
const response = await fetch(`https://api.orbitkit.io/api/apps/-NtestApp123/change-plan`, {
method: "POST",
headers: {
"Authorization": "Bearer " + apiKey,
"Content-Type": "application/json",
},
body: JSON.stringify({
"plan": "monthly"
}),
});
const data = await response.json();
console.log(data);
var request = URLRequest(url: URL(string: "https://api.orbitkit.io/api/apps/-NtestApp123/change-plan")!)
request.httpMethod = "POST"
request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body: [String: Any] = ["plan": "monthly"]
request.httpBody = try JSONSerialization.data(withJSONObject: body)
let (data, _) = try await URLSession.shared.data(for: request)
let json = try JSONSerialization.jsonObject(with: data)
print(json)
200
{
"planType": "monthly",
"currentPeriodEnd": 0
}
400
{
"error": {
"code": "NO_ACTIVE_SUBSCRIPTION",
"message": "No active subscription to change"
}
}
401
{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or expired token",
"docUrl": "https://orbitkit.io/api/errors/#unauthorized"
}
}
404
{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"docUrl": "https://orbitkit.io/api/errors/#not-found"
}
}