Get VPS upgrade options

Return available plan changes and current configurable resource options for one VPS. Get {id} from GET /api/v2/vps data[].id. Use availablePlans[].slug with POST /api/v2/vps/{id}/actions/upgrade when changing plan. Use configurableOptions[].key with POST /api/v2/vps/{id}/actions/config when changing only…

Read full description Hide full description

Return available plan changes and current configurable resource options for one VPS. Get {id} from GET /api/v2/vps data[].id. Use availablePlans[].slug with POST /api/v2/vps/{id}/actions/upgrade when changing plan. Use configurableOptions[].key with POST /api/v2/vps/{id}/actions/config when changing only options such as bandwidthGb, backupSlots, snapshotSlots, ipv4Count, or additionalStorageGb. Snapshot endpoints do not sell snapshot capacity directly; if GET /api/v2/vps/{id}/snapshots or /snapshot-schedules reports available: false or limits.totalSnapshots: 0, add snapshot slots here through snapshotSlots or change to a plan that includes snapshots.

VPS Services Plans & Billing

Authentication

Required API scope: read:vm

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

Responses

200 VPS plan and configurable-option change options.
vpsId string · Example: vps_01hxa3b4c5d6e7f8g9h0j1k2m3
currentProduct null
configurableOptions array<object>

Current product configurable options such as `bandwidthGb`, `backupSlots`, `ipv4Count`, or `additionalStorageGb`. To change only these values, use `POST /api/v2/vps/{id}/actions/config`, not `actions/upgrade`.

configurableOptions[].key string required · Example: bandwidthGb

Canonical resource option key accepted under `resources` by `POST /api/v2/vps/{id}/actions/config`.

configurableOptions[].label string required · Example: Bandwidth
configurableOptions[].type string · enum required · Example: slider
slider
quantity
toggle
input
select
configurableOptions[].min number · Example: 1024
configurableOptions[].max number · Example: 10240
configurableOptions[].step number · Example: 1024
configurableOptions[].default numberstringbooleannull · Example: 2048
configurableOptions[].currentValue numberstringbooleannull required · Example: 2048
configurableOptions[].unit stringnull · Example: GB
configurableOptions[].pricing array<object>
configurableOptions[].includedAtBase numbernull · Example: 2048

Option amount included by the current VPS plan before paid adjustments.

configurableOptions[].constraints object

Runtime constraints. For bandwidth this can raise the effective minimum above the product minimum based on current usage.

configurableOptions[].constraints.min number · Example: 2048
configurableOptions[].constraints.max number · Example: 10240
configurableOptions[].constraints.step number · Example: 1024
configurableOptions[].constraints.unit stringnull · Example: GB
configurableOptions[].constraints.currentValue numberstringbooleannull · Example: 2048
configurableOptions[].constraints.effectiveMin number · Example: 2048
configurableOptions[].constraints.effectiveMax number · Example: 10240
configurableOptions[].constraints.usage object
configurableOptions[].constraints.usage.bandwidthUsedGb number · Example: 193.483

Current-period bandwidth already used, when it affects the minimum orderable bandwidth.

configurableOptions[].constraints.actions object
configurableOptions[].constraints.actions.canDecrease object
configurableOptions[].constraints.actions.canDecrease.allowed boolean required · Example: true
configurableOptions[].constraints.actions.canDecrease.reason stringnull required · Example: null
configurableOptions[].constraints.actions.canDecrease.code stringnull · Example: pending_order

Machine-readable reason code when an action is blocked.

configurableOptions[].constraints.actions.canIncrease object
configurableOptions[].constraints.actions.canIncrease.allowed boolean required · Example: true
configurableOptions[].constraints.actions.canIncrease.reason stringnull required · Example: null
configurableOptions[].constraints.actions.canIncrease.code stringnull · Example: pending_order

Machine-readable reason code when an action is blocked.

configurableOptions[].actions object
availablePlans array<object>
availablePlans[].id stringnull required · Example: vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m3
availablePlans[].slug stringnull required · Example: vps-sm

Canonical plan slug to send as `productSlug` when changing plan.

availablePlans[].tier string required · Example: sm
availablePlans[].name stringnull required · Example: VPS SM
availablePlans[].resources object required
availablePlans[].resources.cpuCores numbernull · Example: 2
availablePlans[].resources.memoryGb numbernull · Example: 4
availablePlans[].resources.storageGb numbernull · Example: 80
availablePlans[].bandwidth object required
availablePlans[].bandwidth.limitGb numbernull · Example: 2048
availablePlans[].billing object required
availablePlans[].billing.amount number · Example: 149
availablePlans[].billing.currencyCode string · Example: SEK
availablePlans[].billing.billingCycle string · Example: monthly
availablePlans[].billingCycles array<object> required · Example: [{"billingCycle":"monthly","amount":149,"currencyCode":"SEK","isPrimary":true,"setupAmo...
availablePlans[].billingCycles[].billingCycle string · Example: monthly
availablePlans[].billingCycles[].amount number · Example: 149
availablePlans[].billingCycles[].currencyCode string · Example: SEK
availablePlans[].billingCycles[].isPrimary boolean · Example: true
availablePlans[].billingCycles[].setupAmount numbernull · Example: null

One-time setup fee for this billing cycle. Null when no setup fee applies.

availablePlans[].availabilityStatus string · enum required · Example: available
available
hidden
out_of_stock
availablePlans[].available boolean required · Example: true
availablePlans[].reason stringnull required · Example: null
availablePlans[].actions object required
availablePlans[].actions.canApply object required
availablePlans[].actions.canApply.allowed boolean required · Example: true
availablePlans[].actions.canApply.reason stringnull required · Example: null
availablePlans[].actions.canApply.code stringnull · Example: pending_order

Machine-readable reason code when an action is blocked.

actions object
actions.canChangeProduct object required
actions.canChangeProduct.allowed boolean required · Example: true
actions.canChangeProduct.reason stringnull required · Example: null
actions.canChangeProduct.code stringnull · Example: pending_order

Machine-readable reason code when an action is blocked.

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
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
GET https://cloud.hostup.se/api/v2/vps/{id}/actions/upgrade
For AI assistants
View as Markdown
cURL
curl -X GET "https://cloud.hostup.se/api/v2/vps/vps_01hxa3b4c5d6e7f8g9h0j1k2m3/actions/upgrade" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
Response
{
  "vpsId": "vps_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "currentProduct": {
    "id": "vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m3",
    "slug": "vps-xs",
    "tier": "xs",
    "name": "VPS XS",
    "resources": {
      "cpuCores": 1,
      "memoryGb": 2,
      "storageGb": 40
    },
    "bandwidth": {
      "limitGb": 2048
    },
    "billing": {
      "amount": 79,
      "currencyCode": "SEK",
      "billingCycle": "monthly"
    },
    "billingCycles": [
      {
        "billingCycle": "monthly",
        "amount": 79,
        "currencyCode": "SEK",
        "isPrimary": true,
        "setupAmount": null
      }
    ],
    "availabilityStatus": "hidden",
    "available": false,
    "reason": "This plan is not currently offered."
  },
  "configurableOptions": [
    {
      "key": "bandwidthGb",
      "label": "Bandwidth",
      "type": "slider",
      "min": 2048,
      "max": 10240,
      "step": 1024,
      "default": 2048,
      "currentValue": 2048,
      "unit": "GB",
      "pricing": [
        {
          "billingCycle": "monthly",
          "amount": 20,
          "currencyCode": "SEK"
        }
      ],
      "constraints": {
        "min": 2048,
        "max": 10240,
        "step": 1024,
        "unit": "GB",
        "currentValue": 2048,
        "effectiveMin": 2048,
        "effectiveMax": 10240,
        "usage": {
          "bandwidthUsedGb": 193.483
        },
        "actions": {
          "canDecrease": {
            "allowed": true,
            "reason": null
          },
          "canIncrease": {
            "allowed": true,
            "reason": null
          }
        }
      },
      "includedAtBase": 2048,
      "actions": {
        "canDecrease": {
          "allowed": true,
          "reason": null
        },
        "canIncrease": {
          "allowed": true,
          "reason": null
        }
      }
    },
    {
      "key": "additionalStorageGb",
      "label": "Attachable Block Storage",
      "type": "slider",
      "min": 0,
      "max": 1000,
      "step": 10,
      "default": 0,
      "currentValue": 100,
      "unit": "GB",
      "pricing": [
        {
          "billingCycle": "monthly",
          "amount": 30,
          "currencyCode": "SEK"
        }
      ],
      "constraints": {
        "min": 100,
        "max": 1000,
        "step": 10,
        "unit": "GB",
        "currentValue": 100,
        "effectiveMin": 100,
        "effectiveMax": 1000,
        "actions": {
          "canDecrease": {
            "allowed": true,
            "reason": null
          },
          "canIncrease": {
            "allowed": true,
            "reason": null
          }
        }
      },
      "includedAtBase": 100,
      "actions": {
        "canDecrease": {
          "allowed": true,
          "reason": null
        },
        "canIncrease": {
          "allowed": true,
          "reason": null
        }
      }
    },
    {
      "key": "snapshotSlots",
      "label": "Snapshot slots",
      "type": "quantity",
      "min": 0,
      "max": 5,
      "step": 1,
      "default": 0,
      "currentValue": 0,
      "unit": "slots",
      "pricing": [
        {
          "billingCycle": "monthly",
          "amount": 10,
          "currencyCode": "SEK"
        }
      ],
      "constraints": {
        "min": 0,
        "max": 5,
        "step": 1,
        "unit": "slots",
        "currentValue": 0,
        "effectiveMin": 0,
        "effectiveMax": 5,
        "actions": {
          "canDecrease": {
            "allowed": false,
            "reason": "No snapshot slots are currently active."
          },
          "canIncrease": {
            "allowed": true,
            "reason": null
          }
        }
      },
      "includedAtBase": 0,
      "actions": {
        "canDecrease": {
          "allowed": false,
          "reason": "No snapshot slots are currently active."
        },
        "canIncrease": {
          "allowed": true,
          "reason": null
        }
      }
    }
  ],
  "availablePlans": [
    {
      "id": "vpsprod_01hxa3b4c5d6e7f8g9h0j1k2m4",
      "slug": "vps-sm",
      "tier": "sm",
      "name": "VPS SM",
      "resources": {
        "cpuCores": 2,
        "memoryGb": 4,
        "storageGb": 80
      },
      "bandwidth": {
        "limitGb": 4096
      },
      "billing": {
        "amount": 149,
        "currencyCode": "SEK",
        "billingCycle": "monthly"
      },
      "billingCycles": [
        {
          "billingCycle": "monthly",
          "amount": 149,
          "currencyCode": "SEK",
          "isPrimary": true,
          "setupAmount": null
        }
      ],
      "availabilityStatus": "available",
      "available": false,
      "reason": "This plan is not currently offered.",
      "actions": {
        "canApply": {
          "allowed": false,
          "reason": "This plan is not currently offered."
        }
      }
    }
  ],
  "actions": {
    "canChangeProduct": {
      "allowed": true,
      "reason": null
    }
  }
}