Allocate a routed IPv6 pool or route a subnet

POST /api/v2/routed-ipv6

Use action: "allocate_pool" to add the account-level /48 when the account has none yet.

Use action: "create_route" with poolId, vpsId, and prefixLength to route a /48, /56, or /64 to a VPS.

prefix is optional; when omitted, the server chooses the first available child prefix in the selected /48.

Creating a route also adds the prefix to the VPS anti-spoofing IP set, and the route propagates to the network asynchronously — allow a short delay after the response before the subnet is reachable.

VPS Services VM

Authentication

Required API scope: write:network

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

Context

Headers

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

Body

required
application/json
action string · enum · Example: create_route
allocate_pool
create_route
poolId string · Example: ripv6_01hxa3b4c5d6e7f8g9h0j1k2m3

Required for create_route. Use pools[].id from GET /api/v2/routed-ipv6.

vpsId string · Example: vps_01hxa3b4c5d6e7f8g9h0j1k2m5

Required for create_route. Use an eligible destinations[].vpsId value.

prefixLength integer · enum · Example: 64

Required for create_route; allowed child prefix length.

48
56
64
prefix string · Example: 2001:db8:1000:100::/56

Optional explicit child prefix. Omit it to let the server choose the first available prefix.

label string · Example: web subnet

Optional customer label for the route.

Responses

201 Routed IPv6 state after the mutation. A successful allocate_pool response includes the new pool in pools[] (and canAllocatePool becomes disallowed); a successful create_route response includes the new route under its pool.
available boolean · Example: true
reason string · nullable · Example: null

allowedPrefixLengths array<integer> · Example: [48,56,64]
pools array<object>
pools[].id string required · Example: ripv6_01hxa3b4c5d6e7f8g9h0j1k2m3
pools[].parentCidr string required · Example: 2001:db8:1000::/48
pools[].prefixLength integer · enum required · Example: 48
48
pools[].status string · enum required · Example: active
active
pools[].allocatedAt string · nullable required · Example: 2026-06-15T12:00:00.000Z

Nullable: may be null when not applicable.

pools[].updatedAt string · nullable required · Example: 2026-06-15T12:00:00.000Z

Nullable: may be null when not applicable.

pools[].routes array<object> required
pools[].routes[].id string required · Example: ripv6rt_01hxa3b4c5d6e7f8g9h0j1k2m4
pools[].routes[].prefix string required · Example: 2001:db8:1000:10::/64
pools[].routes[].prefixLength integer · enum required · Example: 64
48
56
64
pools[].routes[].nextHop string required · Example: 2001:db8::10
pools[].routes[].label string · nullable required · Example: web subnet

Nullable: may be null when not applicable.

pools[].routes[].vpsId string required · Example: vps_01hxa3b4c5d6e7f8g9h0j1k2m5
pools[].routes[].vpsName string required · Example: web-01
pools[].routes[].status string · enum required · Example: active
active
pools[].routes[].allocatedAt string · nullable required · Example: 2026-06-15T12:01:00.000Z

Nullable: may be null when not applicable.

pools[].routes[].updatedAt string · nullable required · Example: 2026-06-15T12:01:00.000Z

Nullable: may be null when not applicable.

pools[].routes[].actions object required
pools[].routes[].actions.canDelete object required

Whether one routed IPv6 action is currently available.

pools[].routes[].actions.canDelete.allowed boolean required · Example: true
pools[].routes[].actions.canDelete.reason string · nullable required · Example: null

Nullable: may be null when not applicable.

pools[].actions object required
pools[].actions.canCreateRoute object required

Whether one routed IPv6 action is currently available.

pools[].actions.canCreateRoute.allowed boolean required · Example: true
pools[].actions.canCreateRoute.reason string · nullable required · Example: null

Nullable: may be null when not applicable.

pools[].actions.canRelease object required

Whether one routed IPv6 action is currently available.

pools[].actions.canRelease.allowed boolean required · Example: true
pools[].actions.canRelease.reason string · nullable required · Example: null

Nullable: may be null when not applicable.

destinations array<object>
destinations[].vpsId string required · Example: vps_01hxa3b4c5d6e7f8g9h0j1k2m5
destinations[].name string required · Example: web-01
destinations[].hostname string · nullable required · Example: web-01.example.com

Configured VPS hostname when one is set. Use name as the display fallback when this is null.

destinations[].primaryIp string · nullable required · Example: 192.0.2.10

Nullable: may be null when not applicable.

destinations[].nextHop string · nullable required · Example: 2001:db8::10

Nullable: may be null when not applicable.

destinations[].serviceStatus string required · Example: active
destinations[].actions object required
destinations[].actions.canReceiveRoute object required

Whether one routed IPv6 action is currently available.

destinations[].actions.canReceiveRoute.allowed boolean required · Example: true
destinations[].actions.canReceiveRoute.reason string · nullable required · Example: null

Nullable: may be null when not applicable.

actions object
actions.canAllocatePool object required

Whether one routed IPv6 action is currently available.

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

Nullable: may be null when not applicable.

actions.canCreateRoute object required

Whether one routed IPv6 action is currently available.

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

Nullable: may be null when not applicable.

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
409 Conflict: the account already has a routed /48 (routed_ipv6_pool_exists), the target VPS is not ready for routed IPv6 (routed_ipv6_conflict), the target VPS does not have IPv6 enabled yet (routed_ipv6_next_hop_missing), the requested prefix overlaps an existing route (routed_ipv6_conflict), or no child prefix of the requested length remains available (routed_ipv6_capacity_exhausted).

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/routed-ipv6
For AI assistants
View as Markdown
cURL
curl -X POST "https://cloud.hostup.se/api/v2/routed-ipv6" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "allocate_pool"
  }'
Response
{
  "available": true,
  "reason": null,
  "allowedPrefixLengths": [
    48,
    56,
    64
  ],
  "pools": [
    {
      "id": "ripv6_01hxa3b4c5d6e7f8g9h0j1k2m3",
      "parentCidr": "2001:db8:1000::/48",
      "prefixLength": 48,
      "status": "active",
      "allocatedAt": "2026-06-15T12:00:00.000Z",
      "updatedAt": "2026-06-15T12:00:00.000Z",
      "routes": [],
      "actions": {
        "canCreateRoute": {
          "allowed": true,
          "reason": null
        },
        "canRelease": {
          "allowed": true,
          "reason": null
        }
      }
    }
  ],
  "destinations": [
    {
      "vpsId": "vps_01hxa3b4c5d6e7f8g9h0j1k2m5",
      "name": "web-01",
      "hostname": "web-01.example.com",
      "primaryIp": "192.0.2.10",
      "nextHop": "2001:db8::10",
      "serviceStatus": "active",
      "actions": {
        "canReceiveRoute": {
          "allowed": true,
          "reason": null
        }
      }
    }
  ],
  "actions": {
    "canAllocatePool": {
      "allowed": false,
      "reason": "This account already has a routed /48."
    },
    "canCreateRoute": {
      "allowed": true,
      "reason": null
    }
  }
}
Request Body Allocate an account /48
{
  "action": "allocate_pool"
}