Skip to content

Roles

Admin-only endpoints to create scoped roles, attach permissions, and assign them to users. Higher weight values represent higher priority and are used when clients need to derive the most important visible role label for a user.

Auth

All routes require a valid API JWT and are currently restricted to the super-admin user.

Role scopes

Roles are scoped to one of:

  • global
  • network
  • server
  • service
  • extension

When scope is not global, provide scopeId (for example a network or server id). Only one role can be marked as default per scope and scopeId combination.

List roles

GET /v1/admin/roles

Response:

json
{
  "items": [
    {
      "id": "671f5b8a7a8a3e6f6e6d6e6d",
      "name": "Global admin",
      "slug": "global-admin",
      "description": "Full access",
      "weight": 100,
      "scope": "global",
      "scopeId": null,
      "isDefault": false,
      "permissions": ["admin:role:manage"],
      "creatorId": "c959d9f9-dcbd-4054-8c4c-d5c305997bc0",
      "createdAt": "2026-01-15T12:00:00Z",
      "updatedAt": null
    }
  ]
}

Create role

POST /v1/admin/roles

Body:

json
{
  "name": "Network admin",
  "slug": "network-admin",
  "description": "Manage a specific network",
  "weight": 50,
  "scope": "network",
  "scopeId": "net-123",
  "isDefault": false,
  "permissions": ["connect:server:manage"]
}

Response:

json
{
  "role": {
    "id": "671f5b8a7a8a3e6f6e6d6e6f",
    "name": "Network admin",
    "slug": "network-admin",
    "description": "Manage a specific network",
    "weight": 50,
    "scope": "network",
    "scopeId": "net-123",
    "isDefault": false,
    "permissions": ["connect:server:manage"],
    "creatorId": "c959d9f9-dcbd-4054-8c4c-d5c305997bc0",
    "createdAt": "2026-01-15T12:00:00Z",
    "updatedAt": null
  }
}

Update role

PATCH /v1/admin/roles/{roleId}

Body:

json
{
  "name": "Network admin",
  "weight": 75,
  "permissions": ["connect:server:manage", "connect:member:manage"],
  "isDefault": true
}

Response:

json
{
  "role": {
    "id": "671f5b8a7a8a3e6f6e6d6e6f",
    "name": "Network admin",
    "slug": "network-admin",
    "description": "Manage a specific network",
    "weight": 75,
    "scope": "network",
    "scopeId": "net-123",
    "isDefault": true,
    "permissions": ["connect:server:manage", "connect:member:manage"],
    "creatorId": "c959d9f9-dcbd-4054-8c4c-d5c305997bc0",
    "createdAt": "2026-01-15T12:00:00Z",
    "updatedAt": "2026-01-15T12:30:00Z"
  }
}

Delete role

DELETE /v1/admin/roles/{roleId}

Response:

json
{ "removed": 1 }

List user roles

GET /v1/admin/users/{userId}/roles

Response:

json
{
  "userId": "c959d9f9-dcbd-4054-8c4c-d5c305997bc0",
  "items": [
    {
      "roleId": "671f5b8a7a8a3e6f6e6d6e6f",
      "name": "Network admin",
      "slug": "network-admin",
      "weight": 75,
      "scope": "network",
      "scopeId": "net-123",
      "permissions": ["connect:server:manage"],
      "expiresAt": "2026-02-01T12:00:00Z"
    }
  ]
}

Assign user role

POST /v1/admin/users/{userId}/roles

Body:

json
{
  "roleId": "671f5b8a7a8a3e6f6e6d6e6f",
  "expiresAt": "2026-02-01T12:00:00Z"
}

Response:

json
{
  "userId": "c959d9f9-dcbd-4054-8c4c-d5c305997bc0",
  "roleId": "671f5b8a7a8a3e6f6e6d6e6f",
  "expiresAt": "2026-02-01T12:00:00Z"
}

expiresAt is optional. When omitted, the role does not expire.

Remove user role

DELETE /v1/admin/users/{userId}/roles/{roleId}

Response:

json
{ "removed": 1 }