Skip to main content

Roles API

Quick example

# Create a custom role
curl "$TRINITITE_BASE/v1/roles" \
-H "Authorization: Bearer $SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "GuardianAuthor",
"description": "Can author and finalize Guardians, but cannot deploy",
"permissions": ["guardians:create", "guardians:update", "policies:read", "test_suites:run"]
}'

Overview

A Role is a named bundle of permission strings. A user's effective permissions are the union of permissions across all their assigned roles. Permissions take the form resource:action and may include wildcards.

Authentication: session token only (Authorization: Bearer <session_token>).


System roles

Four built-in roles ship pre-defined and cannot be edited or deleted. They are listed first in GET /v1/roles and identified by is_system_role: true.

RoleDescription
adminFull platform access (*:*)
auditorRead-only access to compliance, attestation, audit-log, and report surfaces
developerStandard operator role for Guardians, policies, training, and proxy traffic
viewerRead-only access to most surfaces

Permission catalogue

Permissions are resource:action strings. Any role — system or custom — is just a list of these.

PermissionGrants
guardians:read / :create / :write / :adminList, view, and call Guardians; create; update / delete; power operations
policies:read / :writePolicy documents and their nodes
mcp:read / :writeMCP gateway servers, bindings, OAuth
nhi:read / :writeNon-Human Identities
compliance:read / :writeCompliance frameworks, evidence, DSR
reports:read / :writeEnterprise reports
skills:read / :writeSkill Vault
cli:read / :createCLI Firewall (read; execute)
logs:readGlass Box Ledger
audit_logs:readAuditor activity / governance audit log
analytics:readAnalytics rollups
users:create / :read / :update / :deleteUser CRUD
roles:create / :read / :update / :deleteRole CRUD
organization:updateUpdate organization profile
api_keys:read / :writeAPI key inventory

Wildcards

  • <resource>:* — all actions on a single resource (e.g. guardians:*).
  • * or *:* — all actions on all resources. Reserved for the built-in admin system role and explicitly elevated keys.

Endpoints

MethodPathPermission
GET/v1/rolesroles:read
GET/v1/roles/{role_id}roles:read
POST/v1/rolesroles:create
PATCH/v1/roles/{role_id}roles:update
DELETE/v1/roles/{role_id}roles:delete

System roles cannot be modified or deleted via the API — calls to PATCH / DELETE against an is_system_role: true role return 403 forbidden.


GET /v1/roles

{
"roles": [
{
"role_id": "role_system_admin",
"role_name": "admin",
"description": "Full administrative access.",
"permissions": ["*"],
"is_system_role": true
},
{
"role_id": "role_system_auditor",
"role_name": "auditor",
"description": "Read-only access to compliance, attestation, audit, and reports.",
"permissions": [
"compliance:read",
"audit_logs:read",
"logs:read",
"reports:read"
],
"is_system_role": true
},
{
"role_id": "role_01JF8RRO1A2B3C4D5E6F7G8H9I",
"role_name": "compliance-reviewer",
"description": "Read governance logs and analytics.",
"permissions": ["logs:read", "analytics:read"],
"is_system_role": false
}
]
}

GET /v1/roles/{role_id}

Returns a single role object with the same schema as a list row.


POST /v1/roles

Create a custom role.

{
"role_name": "compliance-reviewer",
"description": "Can read governance logs and download compliance reports.",
"permissions": ["logs:read", "analytics:read", "compliance:read", "reports:read"]
}
FieldTypeRequiredDescription
role_namestringYesUnique name within your organization
descriptionstringYesHuman-readable description
permissionsstring[]YesPermission strings (resource:action)

Response — 201 Created:

{
"role_id": "role_01JF8RRO2B3C4D5E6F7G8H9I0J",
"role_name": "compliance-reviewer",
"description": "Can read governance logs and download compliance reports.",
"permissions": ["logs:read", "analytics:read", "compliance:read", "reports:read"],
"is_system_role": false
}

PATCH /v1/roles/{role_id}

Partial update on a custom role. The permissions array, when provided, replaces the full list (not merges).

{
"description": "Read governance logs, analytics, and compliance posture.",
"permissions": ["logs:read", "analytics:read", "compliance:read", "reports:read", "guardians:read"]
}
FieldTypeDescription
descriptionstringUpdated description
permissionsstring[]Replacement permission list

Returns the updated role object.


DELETE /v1/roles/{role_id}

Delete a custom role. Any users currently assigned the role have it removed automatically.

{ "message": "Role deleted successfully.", "role_id": "role_01JF8RRO2B3C4D5E6F7G8H9I0J" }

Errors

HTTPerror.codeCause
400validation_errorBody or query failed schema validation
400bad_requestUnknown permission string
401unauthenticatedMissing or invalid session token
403forbiddenInsufficient permissions, or attempt to modify a system role
404not_foundRole not found in your organization
409conflictA role with that name already exists

Next steps