curl --request POST \
--url https://api.storiza.store/vps/{id}/renew \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target": "server",
"method": "<string>",
"currency": "<string>",
"couponCode": "<string>"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
target: 'server',
method: '<string>',
currency: '<string>',
couponCode: '<string>'
})
};
fetch('https://api.storiza.store/vps/{id}/renew', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.storiza.store/vps/{id}/renew"
payload = {
"target": "server",
"method": "<string>",
"currency": "<string>",
"couponCode": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true,
"message": "Renewal created successfully",
"data": {
"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"
}
}Renew a VPS for another period now
Pays for the next period of this server’s subscription — or its backup add-on, with target: "backup" — without waiting for the automatic renewal.
The period and the price come from the subscription, so this buys exactly one more of what the server is already on. The only choice is how to pay for it.
Leave method out and it comes from the wallet, as the automatic renewal does, and nothing about the subscription changes. Name a provider’s own rail instead — whop_cards — and the subscription moves to that provider: it is sold there as a recurring plan, that provider re-charges the saved card on its own schedule from then on, and our balance worker stops billing the row. Nobody is billed twice, because only one of them ever bills it.
Because the provider’s schedule starts the day it is paid, moving is only allowed once the current period has run out — otherwise the days already paid for would be lost. Renewing early is a wallet-only operation and anything else returns RENEWAL_WOULD_LOSE_TIME.
Only subscriptions Storiza bills itself can be renewed here. One billed by an external provider renews on that provider’s own schedule — charging it again from our side would take payment twice for the same days — so it returns SUBSCRIPTION_EXTERNALLY_BILLED and is managed with POST /payments/subscriptions/:id/manage.
Paid from the balance, settlement is immediate: the returned transaction is already completed and the period has moved. Paid any other way it comes back pending with a checkoutUrl, and the period moves when that payment settles — so treat the response as a transaction to follow, not as a renewal that happened.
Time is added, never reset — renewing early extends from the end of the period already paid for. Renewing after a lapse starts the new period at payment and brings a server that was powered off for non-payment back up.
Required API key permission: vps:write
curl --request POST \
--url https://api.storiza.store/vps/{id}/renew \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target": "server",
"method": "<string>",
"currency": "<string>",
"couponCode": "<string>"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
target: 'server',
method: '<string>',
currency: '<string>',
couponCode: '<string>'
})
};
fetch('https://api.storiza.store/vps/{id}/renew', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.storiza.store/vps/{id}/renew"
payload = {
"target": "server",
"method": "<string>",
"currency": "<string>",
"couponCode": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true,
"message": "Renewal created successfully",
"data": {
"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
Renew the server itself, or its backup add-on
server, backup Pay this one renewal with a different method — a card, crypto. Defaults to the subscription's own. See GET /payments/methods
1Only meaningful alongside method. Defaults to the subscription's.
31 - 64Response
Renewal created successfully
true Renewal created successfully Schema for Transaction model
Show child attributes
Show child attributes
{
"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"
}
Was this page helpful?