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

**List restore source backups**

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`.

### Related Endpoints

- `GET /api/v2/vps/{id}/backups`: List VPS backups
- `POST /api/v2/vps/{id}/backups`: Create VPS backup
- `DELETE /api/v2/vps/{id}/backups/{backupId}`: Delete VPS backup

### Headers

- `Accept`: application/json
- `Authorization`: Bearer YOUR_API_KEY
- Required API scope: `backup:vm`

### Parameters

- `id` (path, string, required): Public target VPS ID. Do not invent this value; use the exact ID returned by the referenced API response. Example: `vps_01hxa3b4c5d6e7f8g9h0j1k2m3`

### Request Example

```bash
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 Schema

- `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, required)
  Allowed values: 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,null, required) Example: `2026-04-27T10:00:00.000Z`
- `sources[].backups[].sizeGb` (integer, required) Example: `12`
- `sources[].backups[].backupType` (string, required) Example: `manual`
- `sources[].backups[].note` (string,null, required) Example: `Before upgrade`

### Responses

#### 200 - Restore sources available to the authenticated client.
```json
{
  "sources": [
    {
      "id": "vps_01j0b3c4d5e6f7g8h9j0k1m2n3",
      "name": "old-server.local",
      "serviceStatus": "terminated",
      "sourceType": "retained",
      "backups": [
        {
          "id": "bkp_01hxa3b4c5d6e7f8g9h0j1k2m3",
          "displayId": "2026-05-24T02:54:03.000Z (2026-05-24T02:54:03Z)",
          "storageKey": "2026-05-24T02:54:03Z",
          "createdAt": "2026-05-24T02:54:03.000Z",
          "sizeGb": 100,
          "minimumRestoreStorageGb": 100,
          "backupType": "scheduled",
          "note": null
        }
      ]
    }
  ]
}
```

#### 400 - Invalid request. The response body is an RFC 7807 Problem Details document.
```json
{
  "type": "https://developer.hostup.se/errors/invalid_request",
  "title": "Invalid request",
  "status": 400,
  "detail": "The request body failed validation.",
  "code": "invalid_request",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z",
  "errors": [
    {
      "pointer": "/items/0/domainName",
      "detail": "`domainName` is required.",
      "code": "invalid_request"
    }
  ]
}
```

#### 401 - Unauthorized. Authentication is required.
```json
{
  "type": "https://developer.hostup.se/errors/unauthorized",
  "title": "Unauthorized",
  "status": 401,
  "detail": "Authentication is required.",
  "code": "unauthorized",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 403 - Forbidden. The caller lacks a required scope or does not own the resource.
```json
{
  "type": "https://developer.hostup.se/errors/forbidden",
  "title": "Forbidden",
  "status": 403,
  "detail": "The caller lacks a required scope or does not own the resource.",
  "code": "forbidden",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 404 - Not found. The resource does not exist or is not owned by the caller.
```json
{
  "type": "https://developer.hostup.se/errors/not_found",
  "title": "Not found",
  "status": 404,
  "detail": "The requested resource could not be found.",
  "code": "not_found",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 429 - Rate limited. Retry after the limit resets. 429 responses include `Retry-After` seconds plus `X-RateLimit-*` headers.
```json
{
  "type": "https://developer.hostup.se/errors/rate_limit_exceeded",
  "title": "Too many requests",
  "status": 429,
  "detail": "Too many requests. Retry after the limit resets.",
  "code": "rate_limit_exceeded",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 500 - Internal error. Retry later or contact support if the issue persists.
```json
{
  "type": "https://developer.hostup.se/errors/internal_error",
  "title": "Internal server error",
  "status": 500,
  "detail": "An unexpected error occurred. Retry later or contact support if the issue persists.",
  "code": "internal_error",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```
