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"
  }
}