Change VPS plan

POST /api/v2/vps/{id}/actions/upgrade

Preview or commit a VPS plan change.

Get {id} from GET /api/v2/vps data[].id.

First call GET /api/v2/vps/{id}/actions/upgrade; send availablePlans[].slug as productSlug.

Payable upgrades return status: awaiting_payment and are applied after the invoice is paid; no-charge upgrades can return status: applied.

Downgrades are scheduled for the next paid-period boundary: the current plan stays active until scheduledChange.effectiveAt, no refund is issued for the current period, and the response has status: scheduled.

This route changes the plan only.

To change option values such as bandwidthGb without changing plan, use POST /api/v2/vps/{id}/actions/config.

By default, paid extra bandwidth above the current plan's included bandwidth is kept on top of the target plan.

Send preserveExtraBandwidth: false only when the customer explicitly chooses to drop paid extra bandwidth for the next period.

Only one scheduled service change can exist at a time; cancel it with DELETE /api/v2/vps/{id}/actions/upgrade before selecting another change.

VPS Services Plans & Billing

Authentication

Required API scope: write:billing

Authenticate with an API key in the Authorization: Bearer <token> header.

Context

Path Parameters

id string required Example: vps_01hxa3b4c5d6e7f8g9h0j1k2m3

Public VPS ID from GET /api/v2/vps data[].id. Do not invent this value; use the exact ID returned by the referenced API response.

Headers

Authorization Bearer <token>
Accept application/json
Content-Type application/json

Body

required
application/json
productSlug string required · Example: vps-sm

Plan slug from GET /api/v2/vps/{id}/actions/upgrade availablePlans[].slug.

billingCycle string · enum · Example: monthly

Optional canonical billing cycle for the target plan.

monthly
quarterly
semiannually
annually
biennially
triennially
dryRun boolean · Example: true

When true, return pricing and payment availability without committing.

cancelExistingInvoice boolean · Example: true

Use only when a 409 existing_invoice_blocking response suggests resending with this flag.

preserveExtraBandwidth boolean · Example: true

Defaults to true. When the VPS currently has paid bandwidth above the included bandwidth of its current plan, keep that extra bandwidth on top of the target plan. Set false only when the customer explicitly chooses to drop paid extra bandwidth; unused paid time is not credited back.

Responses

200 Plan-change preview or committed plan-change result.
VpsUpgradePreview
dryRun boolean required · Example: true
status string · enum required
preview
changeKind string · enum required
upgrade
downgrade
currentProduct object required

Compact public product reference returned for the current and requested VPS plans.

currentProduct.id string · nullable required · Example: vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m3

Nullable: may be null when not applicable.

currentProduct.slug string · nullable required · Example: vps-xs

Nullable: may be null when not applicable.

currentProduct.name string · nullable required · Example: VPS XS

Nullable: may be null when not applicable.

newProduct object required

Compact public product reference returned for the current and requested VPS plans.

newProduct.id string · nullable required · Example: vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m3

Nullable: may be null when not applicable.

newProduct.slug string · nullable required · Example: vps-xs

Nullable: may be null when not applicable.

newProduct.name string · nullable required · Example: VPS XS

Nullable: may be null when not applicable.

paymentInvoice null required
renewalInvoice null required
actions object required
actions.canCommit object required
actions.canCommit.allowed boolean required
actions.canCommit.reason string · nullable required

Nullable: may be null when not applicable.

scheduled boolean
scheduledChange object
scheduledChange.status string · enum required
preview
scheduled
awaiting_payment
paid
applying
applied
needs_attention
cancelling
cancelled
scheduledChange.effectiveAt string · nullable required

Nullable: may be null when not applicable.

scheduledChange.invoiceIssueAt string · nullable required

Nullable: may be null when not applicable.

scheduledChange.target object required
scheduledChange.target.productSlug string
scheduledChange.target.resources object
scheduledChange.target.billing object required
scheduledChange.target.billing.amount number · nullable required

Nullable: may be null when not applicable.

scheduledChange.target.billing.currencyCode string required
scheduledChange.target.billing.billingCycle string · enum required
monthly
quarterly
semiannually
annually
biennially
triennially
free
scheduledChange.actions object required
scheduledChange.actions.canCancel object required
scheduledChange.actions.canCancel.allowed boolean required
scheduledChange.actions.canCancel.reason string · nullable required

Nullable: may be null when not applicable.

warnings array<object> required

Plan-change adjustments selected by the server, such as preserved storage, preserved paid extra bandwidth, or bandwidth raised to cover current-period usage.

warnings[].code string required · Example: package_bandwidth_preserved

Machine-readable adjustment code, for example package_bandwidth_preserved, package_bandwidth_adjusted, package_storage_preserved, or package_config_option_preserved.

warnings[].severity string · enum required · Example: warning
warning
warnings[].resource string · enum required · Example: bandwidth
bandwidth
storage
backups
snapshots
ipv4
ipv6
attachableStorage
warnings[].reason string required · Example: This VPS currently has 10 TB extra bandwidth. We will keep that extra bandwidth on the ...

Human-readable explanation safe to show to the customer.

warnings[].included object
warnings[].included.value number required · Example: 10240

Amount in the unit named by unit.

warnings[].included.unit string · enum required · Example: GB
GB
slots
addresses
warnings[].current object
warnings[].current.value number required · Example: 10240

Amount in the unit named by unit.

warnings[].current.unit string · enum required · Example: GB
GB
slots
addresses
warnings[].usage object
warnings[].usage.value number required · Example: 10240

Amount in the unit named by unit.

warnings[].usage.unit string · enum required · Example: GB
GB
slots
addresses
warnings[].adjusted object required
warnings[].adjusted.value number required · Example: 10240

Amount in the unit named by unit.

warnings[].adjusted.unit string · enum required · Example: GB
GB
slots
addresses
warnings[].extra object
warnings[].extra.value number required · Example: 10240

Amount in the unit named by unit.

warnings[].extra.unit string · enum required · Example: GB
GB
slots
addresses
VpsUpgradeResult
status string · enum required
scheduled
awaiting_payment
processing
applied
changeKind string · enum required
upgrade
downgrade
currentProduct object required

Compact public product reference returned for the current and requested VPS plans.

currentProduct.id string · nullable required · Example: vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m3

Nullable: may be null when not applicable.

currentProduct.slug string · nullable required · Example: vps-xs

Nullable: may be null when not applicable.

currentProduct.name string · nullable required · Example: VPS XS

Nullable: may be null when not applicable.

paymentInvoice null required
renewalInvoice null required
scheduled boolean
scheduledChange object
scheduledChange.status string · enum required
preview
scheduled
awaiting_payment
paid
applying
applied
needs_attention
cancelling
cancelled
scheduledChange.effectiveAt string · nullable required

Nullable: may be null when not applicable.

scheduledChange.invoiceIssueAt string · nullable required

Nullable: may be null when not applicable.

scheduledChange.target object required
scheduledChange.target.productSlug string
scheduledChange.target.resources object
scheduledChange.target.billing object required
scheduledChange.target.billing.amount number · nullable required

Nullable: may be null when not applicable.

scheduledChange.target.billing.currencyCode string required
scheduledChange.target.billing.billingCycle string · enum required
monthly
quarterly
semiannually
annually
biennially
triennially
free
scheduledChange.actions object required
scheduledChange.actions.canCancel object required
scheduledChange.actions.canCancel.allowed boolean required
scheduledChange.actions.canCancel.reason string · nullable required

Nullable: may be null when not applicable.

newProduct object required

Compact public product reference returned for the current and requested VPS plans.

newProduct.id string · nullable required · Example: vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m3

Nullable: may be null when not applicable.

newProduct.slug string · nullable required · Example: vps-xs

Nullable: may be null when not applicable.

newProduct.name string · nullable required · Example: VPS XS

Nullable: may be null when not applicable.

invoiceLookupPending boolean · Example: true

True when the plan change committed and backend renewal invoice regeneration is still pending.

warnings array<object> required

Plan-change adjustments selected by the server, such as preserved storage, preserved paid extra bandwidth, or bandwidth raised to cover current-period usage.

warnings[].code string required · Example: package_bandwidth_preserved

Machine-readable adjustment code, for example package_bandwidth_preserved, package_bandwidth_adjusted, package_storage_preserved, or package_config_option_preserved.

warnings[].severity string · enum required · Example: warning
warning
warnings[].resource string · enum required · Example: bandwidth
bandwidth
storage
backups
snapshots
ipv4
ipv6
attachableStorage
warnings[].reason string required · Example: This VPS currently has 10 TB extra bandwidth. We will keep that extra bandwidth on the ...

Human-readable explanation safe to show to the customer.

warnings[].included object
warnings[].included.value number required · Example: 10240

Amount in the unit named by unit.

warnings[].included.unit string · enum required · Example: GB
GB
slots
addresses
warnings[].current object
warnings[].current.value number required · Example: 10240

Amount in the unit named by unit.

warnings[].current.unit string · enum required · Example: GB
GB
slots
addresses
warnings[].usage object
warnings[].usage.value number required · Example: 10240

Amount in the unit named by unit.

warnings[].usage.unit string · enum required · Example: GB
GB
slots
addresses
warnings[].adjusted object required
warnings[].adjusted.value number required · Example: 10240

Amount in the unit named by unit.

warnings[].adjusted.unit string · enum required · Example: GB
GB
slots
addresses
warnings[].extra object
warnings[].extra.value number required · Example: 10240

Amount in the unit named by unit.

warnings[].extra.unit string · enum required · Example: GB
GB
slots
addresses
400 Invalid request. The response body is an RFC 7807 Problem Details document.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
401 Unauthorized. Authentication is required.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
403 Forbidden. The caller lacks a required scope or does not own the resource.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
404 Not found. The resource does not exist or is not owned by the caller.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
409 The plan change is blocked by an existing invoice, an existing scheduled change, or temporarily unavailable scheduled-change processing.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
429 Rate limited. Retry after the limit resets. 429 responses include Retry-After seconds plus X-RateLimit-* headers.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
500 Internal error. Retry later or contact support if the issue persists.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
502 The service billing currency or next renewal amount could not be verified.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
POST https://cloud.hostup.se/api/v2/vps/{id}/actions/upgrade
For AI assistants
View as Markdown
cURL
curl -X POST "https://cloud.hostup.se/api/v2/vps/vps_01hxa3b4c5d6e7f8g9h0j1k2m3/actions/upgrade" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "productSlug": "vps-sm",
    "billingCycle": "monthly",
    "dryRun": true
  }'
Response
// Immediate upgrade preview
{
  "dryRun": true,
  "status": "preview",
  "changeKind": "upgrade",
  "currentProduct": {
    "id": "vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m3",
    "slug": "vps-xs",
    "name": "VPS XS"
  },
  "newProduct": {
    "id": "vpsprod_01j0b3c4d5e6f7g8h9j0k1m2n3",
    "slug": "vps-sm",
    "name": "VPS SM"
  },
  "paymentInvoice": {
    "amount": 70,
    "currencyCode": "SEK",
    "servicePeriodEndAt": "2026-08-11T00:00:00.000Z"
  },
  "renewalInvoice": {
    "amount": 149,
    "currencyCode": "SEK"
  },
  "actions": {
    "canCommit": {
      "allowed": true,
      "reason": null
    }
  },
  "warnings": []
}

// Downgrade scheduled for the next paid period
{
  "status": "scheduled",
  "changeKind": "downgrade",
  "scheduled": true,
  "scheduledChange": {
    "status": "scheduled",
    "effectiveAt": "2026-08-11T00:00:00.000Z",
    "invoiceIssueAt": "2026-07-28T00:00:00.000Z",
    "target": {
      "productSlug": "vps-xs",
      "billing": {
        "amount": 39,
        "currencyCode": "SEK",
        "billingCycle": "monthly"
      }
    },
    "actions": {
      "canCancel": {
        "allowed": true,
        "reason": null
      }
    }
  },
  "currentProduct": {
    "id": "vpsprod_01j0b3c4d5e6f7g8h9j0k1m2n3",
    "slug": "vps-sm",
    "name": "VPS SM"
  },
  "newProduct": {
    "id": "vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m3",
    "slug": "vps-xs",
    "name": "VPS XS"
  },
  "paymentInvoice": null,
  "renewalInvoice": null,
  "warnings": []
}
Request Body Preview plan change
{
  "productSlug": "vps-sm",
  "billingCycle": "monthly",
  "dryRun": true
}