## PUT /api/v2/vps/{id}/hostname

**Change VPS hostname**

Change the VPS hostname. Send exactly `hostname`; it must be a valid FQDN up to 253 characters, with labels using letters, numbers, and hyphens but no leading or trailing hyphen. Reverse DNS protection details tell whether existing reverse DNS records were restored after the change.

### Related Endpoints

- `GET /api/v2/vps/{id}/hostname`: Get VPS hostname
- `GET /api/v2/vps/{id}`: Get VPS details
- `GET /api/v2/vps/{id}/iso`: List VPS ISO media

### Headers

- `Accept`: application/json
- `Authorization`: Bearer YOUR_API_KEY
- Required API scope: `write:vm`
- `Content-Type`: application/json

### Parameters

- `id` (path, string, required): Public VPS ID. Get it from GET /api/v2/vps `data[].id`. Do not invent this value; use the exact ID returned by the referenced API response. Example: `vps_01hxa3b4c5d6e7f8g9h0j1k2m3`

### Request Body

- `hostname` (string, required) Example: `web-01.example.com`

### Request Examples

#### Change hostname

```bash
curl -X PUT "https://cloud.hostup.se/api/v2/vps/vps_01hxa3b4c5d6e7f8g9h0j1k2m3/hostname" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "hostname": "web-01.example.com"
  }'
```

```json
{
  "hostname": "web-01.example.com"
}
```

### Response Schema

- `hostname` (string,null, required) Example: `web-01.example.com`
- `reloadRecommended` (boolean, required) Example: `false`
- `accountInactive` (boolean, required) Example: `false`
- `accountStatus` (string,null, required) Example: `active`
- `cacheCleared` (boolean, required) Example: `true`
- `actions` (object, required)
- `actions.canChange` (object, required)
- `actions.canChange.allowed` (boolean, required) Example: `true`
- `actions.canChange.reason` (string,null, required) Example: `null`
- `validationRules` (object, required)
- `validationRules.maxLengthChars` (integer, required) Example: `253`
- `validationRules.pattern` (string, required) Example: `^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$`
- `validationRules.patternDescription` (string, required) Example: `Valid FQDN: labels 1-63 chars, alphanumeric with hyphens, no leading/trailing hyphens.`
- `hostnameNormalized` (boolean, required) Example: `true`
- `serviceRecordSynced` (boolean, required) Example: `true`
- `reverseDnsProtection` (object | null, required) Example: `null`
- `reverseDnsProtection.status` (string, required) Example: `not_changed`
  Allowed values: not_changed, restored, partial_failure
- `reverseDnsProtection.monitoredIpCount` (integer, required) Example: `1`
- `reverseDnsProtection.changesDetected` (integer, required) Example: `0`
- `reverseDnsProtection.restoredIps` (array<string>, required)
- `reverseDnsProtection.failedIps` (array<string>, required)
- `reverseDnsProtection.detail` (string,null, required) Example: `null`
- `updatedAt` (string, required) Example: `2026-04-27T12:00:00.000Z`

### Responses

#### 200 - Hostname changed.
```json
{
  "hostname": "web-01.example.com",
  "reloadRecommended": false,
  "accountInactive": false,
  "accountStatus": "active",
  "cacheCleared": true,
  "hostnameNormalized": true,
  "serviceRecordSynced": true,
  "reverseDnsProtection": {
    "status": "not_changed",
    "monitoredIpCount": 1,
    "changesDetected": 0,
    "restoredIps": [],
    "failedIps": [],
    "detail": null
  },
  "actions": {
    "canChange": {
      "allowed": true,
      "reason": null
    }
  },
  "validationRules": {
    "maxLengthChars": 253,
    "pattern": "^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$",
    "patternDescription": "Valid FQDN: labels 1-63 chars, alphanumeric with hyphens, no leading/trailing hyphens."
  },
  "updatedAt": "2026-04-27T12:00:00.000Z"
}
```

#### 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"
}
```
