List restore source backups

GET /api/v2/vps/{id}/backups/restore-sources

Lists owned source servers and retained source backups that can be restored onto the active target VPS.

Retained backups from terminated services are returned only when saved ownership metadata ties the backup to the authenticated client/account.

Use a returned sources[].id as sourceVpsId and a nested sources[].backups[].id as backupId when calling POST /api/v2/vps/{id}/backups/actions/restore-from-vps.

Every backup carries targetFit, the verdict for restoring that backup onto this target: fits (start the restore), grow_required (the backup is larger than the target's storage, and the target is a Cloud VM whose metered storage can grow to requiredStorageGb; send growTargetStorage: true with the restore), too_small (the target cannot grow; pick a target with at least requiredStorageGb GB or restore to a new server from the source), or unconfirmed (the target's storage could not be read; the restore re-checks it).

target.actions.canGrowStorage reports whether this target's storage can be grown at all, independent of any single backup.

VPS Services Backups

Authentication

Required API scope: backup:vm

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

Context

Path Parameters

id string required Example: vps_01hxa3b4c5d6e7f8g9h0j1k2m3

Public target VPS ID. Do not invent this value; use the exact ID returned by the referenced API response.

Headers

Authorization Bearer <token>
Accept application/json

Responses

200 Restore sources available to the authenticated client.
target object required
target.storageGb integer · nullable required · Example: 50

Confirmed storage of the target VPS, or null when it could not be read.

target.actions object required
target.actions.canGrowStorage object required

Whether the target's storage can be grown during a restore. Only Cloud VMs (metered storage) can grow; fixed plans keep the plan's disk.

target.actions.canGrowStorage.allowed boolean required · Example: true
target.actions.canGrowStorage.reason string · nullable required · Example: null

Nullable: may be null when not applicable.

target.actions.canGrowStorage.code string · nullable · Example: pending_order

Machine-readable reason code when an action is blocked.

sources array<object> required
sources[].id string required

Public source VPS ID.

sources[].name string required
sources[].serviceStatus string required · Example: terminated
sources[].sourceType string · enum required
server
retained
sources[].backups array<object> required
sources[].backups[].id string required · Example: bkp_01hxa3b4c5d6e7f8g9h0j1k2m3
sources[].backups[].displayId string required · Example: 2026-04-27T10:00:00.000Z (vzdump-qemu-101.vma.zst)
sources[].backups[].storageKey string required · Example: vzdump-qemu-101.vma.zst
sources[].backups[].createdAt string · nullable required · Example: 2026-04-27T10:00:00.000Z

Nullable: may be null when not applicable.

sources[].backups[].sizeGb integer required · Example: 12
sources[].backups[].backupType string required · Example: manual
sources[].backups[].note string · nullable required · Example: Before upgrade

Nullable: may be null when not applicable.

sources[].backups[].actions object

Per-backup content availability. A configuration-only snapshot has canRestore.allowed=false even if the account-level restore gate permits restores. Missing legacy metadata is not proof that disk data is absent.

sources[].backups[].actions.canRestore object
sources[].backups[].actions.canRestore.allowed boolean required · Example: true
sources[].backups[].actions.canRestore.reason string · nullable required · Example: null

Nullable: may be null when not applicable.

sources[].backups[].actions.canRestore.code string · nullable · Example: pending_order

Machine-readable reason code when an action is blocked.

sources[].backups[].diskImageInventory object

Disk images recorded by this dated backup's PBS manifest. Current VM size, entitlement and matching slot names do not prove the same current disk's contents are covered. A partial/unavailable inventory cannot establish absence or completeness.

sources[].backups[].diskImageInventory.source string · enum
pbs_manifest
partial
unavailable
sources[].backups[].diskImageInventory.disks array<object>
sources[].backups[].diskImageInventory.disks[].slot string · Example: scsi1
sources[].backups[].diskImageInventory.disks[].sizeGb number · nullable

Logical image size in GiB, when present in the manifest.

sources[].backups[].targetFit object required

Verdict for restoring this backup onto the target VPS in the path. Branch on status; reason is display text when the status is not fits.

sources[].backups[].targetFit.status string · enum required · Example: grow_required
fits
grow_required
too_small
unconfirmed
sources[].backups[].targetFit.reason string · nullable required · Example: This backup needs 100 GB of storage. The target server has 50 GB; its storage grows to ...

Nullable: may be null when not applicable.

sources[].backups[].targetFit.requiredStorageGb integer required · Example: 100

Disk size the restore recreates on the target.

sources[].backups[].targetFit.targetStorageGb integer · nullable required · Example: 50

Target VPS storage as confirmed right now; null when unconfirmed.

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; code is vps_not_found.
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}/backups/restore-sources
For AI assistants
View as Markdown
cURL
curl -X GET "https://cloud.hostup.se/api/v2/vps/vps_01hxa3b4c5d6e7f8g9h0j1k2m3/backups/restore-sources" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
Response
{
  "target": {
    "storageGb": 50,
    "actions": {
      "canGrowStorage": {
        "allowed": true,
        "reason": null
      }
    }
  },
  "sources": [
    {
      "id": "vps_01j0b3c4d5e6f7g8h9j0k1m2n3",
      "name": "web01.example.com",
      "serviceStatus": "active",
      "sourceType": "server",
      "backups": [
        {
          "id": "bkp_01hxa3b4c5d6e7f8g9h0j1k2m3",
          "displayId": "2026-08-15T03:19:03.000Z (2026-08-15T03:19:03Z)",
          "storageKey": "2026-08-15T03:19:03Z",
          "createdAt": "2026-08-15T03:19:03.000Z",
          "sizeGb": 100,
          "minimumRestoreStorageGb": 100,
          "backupType": "scheduled",
          "note": null,
          "targetFit": {
            "status": "grow_required",
            "reason": "This backup needs 100 GB of storage. The target server has 50 GB; its storage grows to 100 GB as part of the restore.",
            "requiredStorageGb": 100,
            "targetStorageGb": 50
          }
        }
      ]
    }
  ]
}