Restart one VPS to separate a placement group

POST /api/v2/placement-groups/{id}/actions/resolve

Start the self-serve fix for a placement group that needs attention after automatic separation could not finish.

The operation briefly shuts down one colocated VPS, moves it to separate hardware, and starts it again.

Call this only when the placement group detail has needsAttention: true and actions.canResolve.allowed: true.

The 202 response body is the refreshed placement group detail (there is no separate operation object); poll GET /api/v2/placement-groups/{id}/status until health returns to ok.

Cloud VPS Cloud VPS

Authentication

Required API scope: write:vm

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

Context

Path Parameters

id string required Example: pg_01hxa3b4c5d6e7f8g9h0j1k2m3

Placement group public ID. Do not invent this value; use the exact ID returned by the referenced API response.

Headers

Authorization Bearer <token>
Accept application/json
Content-Type application/json

Body

required
application/json
acceptRestart boolean required

Must be true to confirm the short restart of one VPS.

Responses

202 Separation was accepted and queued. The returned placement group detail is normally reconciling while the move runs; poll GET /api/v2/placement-groups/{id}/status until health is ok.
id string required · Example: pg_01hxa3b4c5d6e7f8g9h0j1k2m3
name string required · Example: Production database
policy string · enum required · Example: spread
spread
health string · enum required · Example: reconciling
ok
reconciling
violation
needsAttention boolean required · Example: false
compatibilityKey string · nullable required · Example: pgcmp_9f6a3b2c1d0e8a7b

members array<object> required
members[].vpsId string required · Example: vps_01hxa3b4c5d6e7f8g9h0j1k2m3
members[].name string required · Example: db-replica
members[].instanceUrl string required · Example: /instance/vps_01hxa3b4c5d6e7f8g9h0j1k2m3
members[].placementSet string · enum required · Example: b
a
b
c
members[].status string · enum required · Example: migrating
placed
migrating
colocated
unknown
members[].addedAt string required · Example: 2026-06-28T10:02:00.000Z
actions object required
actions.canRename object required
actions.canRename.allowed boolean required · Example: true
actions.canRename.reason string · nullable required · Example: null

Nullable: may be null when not applicable.

actions.canDelete object required
actions.canDelete.allowed boolean required · Example: true
actions.canDelete.reason string · nullable required · Example: null

Nullable: may be null when not applicable.

actions.canAddMember object required
actions.canAddMember.allowed boolean required · Example: true
actions.canAddMember.reason string · nullable required · Example: null

Nullable: may be null when not applicable.

actions.canResolve object required
actions.canResolve.allowed boolean required · Example: false
actions.canResolve.reason string · nullable · enum required · Example: not_needed

Why the resolve action is unavailable: not_needed when the group has no issue a restart can fix, no_restart_target when no suitable separate hardware is available right now. null when allowed is true.

not_needed
no_restart_target
createdAt string required · Example: 2026-06-28T10:00:00.000Z
updatedAt string required · Example: 2026-06-28T10:05:00.000Z
400 acceptRestart was missing or not true. code is invalid_request.

No response body

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 The signed-in contact does not have access to the VPS that would be restarted. code is contact_permission_required.

No response body

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 The placement group cannot start a restart-based separation right now — nothing needs fixing, a move is already in progress, or no separate hardware is available. code is resolve_not_available.

No response body

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/placement-groups/{id}/actions/resolve
For AI assistants
View as Markdown
cURL
curl -X POST "https://cloud.hostup.se/api/v2/placement-groups/pg_01hxa3b4c5d6e7f8g9h0j1k2m3/actions/resolve" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "acceptRestart": true
  }'
Response
{
  "id": "pg_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "name": "Production database",
  "policy": "spread",
  "health": "reconciling",
  "needsAttention": false,
  "compatibilityKey": "pgcmp_9f6a3b2c1d0e8a7b",
  "members": [
    {
      "vpsId": "vps_01hxa3b4c5d6e7f8g9h0j1k2m3",
      "name": "db-replica",
      "instanceUrl": "/instance/vps_01hxa3b4c5d6e7f8g9h0j1k2m3",
      "placementSet": "b",
      "status": "migrating",
      "addedAt": "2026-06-28T10:02:00.000Z"
    }
  ],
  "actions": {
    "canRename": {
      "allowed": true,
      "reason": null
    },
    "canDelete": {
      "allowed": true,
      "reason": null
    },
    "canAddMember": {
      "allowed": true,
      "reason": null
    },
    "canResolve": {
      "allowed": false,
      "reason": "not_needed"
    }
  },
  "createdAt": "2026-06-28T10:00:00.000Z",
  "updatedAt": "2026-06-28T10:05:00.000Z"
}
Request Body
{
  "acceptRestart": true
}