Change VPS plan

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. This route changes the plan only. To change option values such as bandwidthGb without changing plan, use `POST…

Read full description Hide full description

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. This route changes the plan only. To change option values such as bandwidthGb without changing plan, use POST /api/v2/vps/{id}/actions/config. Unsupported fields such as productId, resources, draftId, send, or estimate are rejected. 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; unused paid time is not credited back.

VPS Services Plans & Billing

Authentication

Required API scope: write:billing

Use Authorization: Bearer <token> for API keys. Dashboard sessions may also use hostup_session.

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

Accept Example
Content-Type Example

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.
dryRun boolean · Example: true
currentProduct object

Compact current-product reference returned by VPS plan-change preview and commit responses.

currentProduct.id stringnull required · Example: vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m3
currentProduct.displayId stringnull required · Example: null

Human-display product identifier when one exists. VPS products usually return null; use `slug` for display and follow-up requests.

currentProduct.slug stringnull required · Example: vps-xs
currentProduct.name stringnull required · Example: VPS XS
paymentInvoice objectnull
renewalInvoice objectnull
actions object
actions.canCommit object
actions.canCommit.allowed boolean required · Example: true
actions.canCommit.reason stringnull required · Example: null
actions.canCommit.code stringnull · Example: pending_order

Machine-readable reason code when an action is blocked.

warnings array<object>

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`, or `package_storage_preserved`.

warnings[].severity string · enum required · Example: warning
warning
warnings[].resource string · enum required · Example: bandwidth
bandwidth
storage
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
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
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
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
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
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 Conflict. See the Problem Details `code` for the route-specific blocker and recovery fields.
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
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
{
  "dryRun": true,
  "currentProduct": {
    "id": "vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m3",
    "displayId": null,
    "slug": "vps-xs",
    "name": "VPS XS"
  },
  "paymentInvoice": {
    "amount": 70,
    "currencyCode": "SEK",
    "paymentMethods": {
      "card": {
        "available": true,
        "reason": null
      },
      "swish": {
        "available": false,
        "reason": "Swish is only available for SEK invoices. This invoice is EUR."
      }
    },
    "availablePaymentMethods": [
      "card",
      "swish"
    ],
    "actions": {
      "canPayWithAvailableMethod": {
        "allowed": true,
        "reason": null
      }
    }
  },
  "renewalInvoice": null,
  "actions": {
    "canCommit": {
      "allowed": true,
      "reason": null
    }
  },
  "warnings": []
}
Request Body Preview plan change
{
  "productSlug": "vps-sm",
  "billingCycle": "monthly",
  "dryRun": true
}