curl --request POST \
--url https://api.storiza.store/vps/{id}/upgrade \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"planId": "<string>",
"method": "<string>",
"currency": "<string>",
"dryRun": false
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({planId: '<string>', method: '<string>', currency: '<string>', dryRun: false})
};
fetch('https://api.storiza.store/vps/{id}/upgrade', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.storiza.store/vps/{id}/upgrade"
payload = {
"planId": "<string>",
"method": "<string>",
"currency": "<string>",
"dryRun": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true,
"message": "Upgrade started successfully",
"data": {
"amount": 123,
"renewalAmount": 123,
"daysRemaining": 123,
"currentPlan": "<string>",
"newPlan": "<string>",
"dryRun": true,
"transaction": {
"id": 1042,
"type": "topup",
"status": "pending",
"direction": "deposit",
"method": "credit-cards",
"provider": "polar",
"currency": null,
"conversionRate": "1",
"subtotalAmount": "100",
"discountAmount": "10",
"netAmount": "90",
"taxAmount": "0",
"totalAmount": "90",
"user": {
"id": "00000000-0000-4000-8000-000000000000"
},
"coupon": null,
"supportsIframes": false,
"applePaySession": null,
"expiresAt": "2026-10-09T15:57:33.916Z"
}
}
}Move a VPS to a larger plan, charging the prorated difference
Charges the difference between the current plan and the new one for the days remaining in the current period, then resizes the machine and re-prices future renewals.
The renewal date is never moved — an upgrade buys capacity, not time. For 7/30d→9/30d with 6 days left the charge is (9 − 7) ÷ 30 × 6 = $0.40, because those 6 days are already paid for at the old rate.
Send dryRun: true to price an upgrade without charging anything; the response carries the same figures the real call would use.
Downgrades are refused (NOT_AN_UPGRADE) — a plan must be at least as large in CPU, threads, RAM and storage, and larger in one of them. The server is stopped, resized and started again, so expect a short interruption.
Required API key permission: vps:write
curl --request POST \
--url https://api.storiza.store/vps/{id}/upgrade \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"planId": "<string>",
"method": "<string>",
"currency": "<string>",
"dryRun": false
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({planId: '<string>', method: '<string>', currency: '<string>', dryRun: false})
};
fetch('https://api.storiza.store/vps/{id}/upgrade', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.storiza.store/vps/{id}/upgrade"
payload = {
"planId": "<string>",
"method": "<string>",
"currency": "<string>",
"dryRun": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true,
"message": "Upgrade started successfully",
"data": {
"amount": 123,
"renewalAmount": 123,
"daysRemaining": 123,
"currentPlan": "<string>",
"newPlan": "<string>",
"dryRun": true,
"transaction": {
"id": 1042,
"type": "topup",
"status": "pending",
"direction": "deposit",
"method": "credit-cards",
"provider": "polar",
"currency": null,
"conversionRate": "1",
"subtotalAmount": "100",
"discountAmount": "10",
"netAmount": "90",
"taxAmount": "0",
"totalAmount": "90",
"user": {
"id": "00000000-0000-4000-8000-000000000000"
},
"coupon": null,
"supportsIframes": false,
"applePaySession": null,
"expiresAt": "2026-10-09T15:57:33.916Z"
}
}
}Authorizations
An API key from the Storiza dashboard (API & Integrations), sent as Authorization: Bearer stz_….
Path Parameters
1Body
Was this page helpful?