Skip to content

IAM — User Groups

The roles a group carries and the accounts in it are links under the group CRN, not fields on the entry. A role reached through a group is held just like one paired by hand, and membership is resolved per request — a change lands on the next call, without a new token.

A rule on <usergroup>.users expands into one rule per member — read, update and delete, never create — while a rule naming the group alone produces none, so seeing a group and reaching the accounts in it stay separate rights. Changes raise IAM_USERGROUP_PAIR_ROLE and IAM_USERGROUP_PAIR_USER with their UNPAIR counterparts.

POSTCreate a user group/api/v1/usergroup
GETList user groups/api/v1/usergroup
GETRead a user group/api/v1/usergroup/:usergroupId
PATCHUpdate a user group/api/v1/usergroup/:usergroupId
DELETEDelete a user group/api/v1/usergroup/:usergroupId
GETList the group's roles/api/v1/usergroup/:usergroupId/roles
POSTAdd roles to a group/api/v1/usergroup/:usergroupId/roles
DELETERemove roles from a group/api/v1/usergroup/:usergroupId/roles
GETList the group's members/api/v1/usergroup/:usergroupId/users
POSTAdd members to a group/api/v1/usergroup/:usergroupId/users
DELETERemove members from a group/api/v1/usergroup/:usergroupId/users

Create a user group

A user group is a named bundle of roles: it starts empty, and roles and members are added through its sub-routes. tenantId is only needed when the caller's access spans more than one tenant.

POST/api/v1/usergroup

Body

NameDescription
namestring1 to 64 characters and the only field the body requires; a name already used in the tenant is not refused.
min length 1 · max length 64
descriptionstringoptionalOptional note on what the group is for.
tenantIdstringoptionalTenant to create the group in — only needed when the caller's access spans more than one.
Pattern: ^[0-9A-HJ-NP-Za-km-z]{9,16}$

Response

NameDescription
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource

Errors

StatusDescriptionBody
403You do not have permission to perform this action
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
400The request did not match the schema for this endpoint. The details field carries the specific failures.error: Validation Error
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50

List user groups

The groups of the caller's tenant, filtered one by one by read — a principal scoped to single groups still sees those rather than nothing at all.

GET/api/v1/usergroup

Response

NameDescription
namestring1 to 64 characters; two groups in a tenant may carry the same name, nothing enforces uniqueness.
min length 1 · max length 64
descriptionstringoptionalWhat the group is for; absent when none was given.
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
createdBystringResource identifier of the entity that created this resource

Errors

StatusDescriptionBody
403You do not have permission to perform this action
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50

Read a user group

Name and description only. What the group carries and who is in it are separate calls, /roles and /users.

GET/api/v1/usergroup/Yk3pL7rWq2

Path Parameters

NameDescription
usergroupIdstringResource id: Base58 (9–10 characters) or a 16-character Crockford snowflake. Not an RFC 4122 UUID.
Pattern: ^[0-9A-HJ-NP-Za-km-z]{9,16}$

Response

NameDescription
namestring1 to 64 characters; two groups in a tenant may carry the same name, nothing enforces uniqueness.
min length 1 · max length 64
descriptionstringoptionalWhat the group is for; absent when none was given.
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
createdBystringResource identifier of the entity that created this resource

Errors

StatusDescriptionBody
403You do not have permission to perform this action
404No user group with this id exists in the resolved tenant. Check the id, and where the caller's access spans several tenants that X-Tenant-Id names the right one.
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
400The request did not match the schema for this endpoint. The details field carries the specific failures.error: Validation Error
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50

Update a user group

Writes name and description; a field left out stays as it is. Neither the roles the group carries nor its members are touched here.

PATCH/api/v1/usergroup/Yk3pL7rWq2

Path Parameters

NameDescription
usergroupIdstringResource id: Base58 (9–10 characters) or a 16-character Crockford snowflake. Not an RFC 4122 UUID.
Pattern: ^[0-9A-HJ-NP-Za-km-z]{9,16}$

Body

NameDescription
namestringoptional1 to 64 characters; left out, the stored name stays.
min length 1 · max length 64
descriptionstringoptionalReplaces the stored text; left out it stays as it is, and an empty string is the only way to blank it.

Errors

StatusDescriptionBody
403You do not have permission to perform this action
404No user group with this id exists in the resolved tenant. Check the id, and where the caller's access spans several tenants that X-Tenant-Id names the right one.
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
400The request did not match the schema for this endpoint. The details field carries the specific failures.error: Validation Error
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50

Delete a user group

Unlinks the group's roles and its members before removing it, so everyone in it loses what it granted. The roles and the accounts themselves stay.

DELETE/api/v1/usergroup/Yk3pL7rWq2

Path Parameters

NameDescription
usergroupIdstringResource id: Base58 (9–10 characters) or a 16-character Crockford snowflake. Not an RFC 4122 UUID.
Pattern: ^[0-9A-HJ-NP-Za-km-z]{9,16}$

Errors

StatusDescriptionBody
403You do not have permission to perform this action
404No user group with this id exists in the resolved tenant. Check the id, and where the caller's access spans several tenants that X-Tenant-Id names the right one.
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
400The request did not match the schema for this endpoint. The details field carries the specific failures.error: Validation Error
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50

List the group's roles

The CRNs of the roles the group hands to its members. It takes read on the group, not on the roles.

GET/api/v1/usergroup/Yk3pL7rWq2/roles

Path Parameters

NameDescription
usergroupIdstringResource id: Base58 (9–10 characters) or a 16-character Crockford snowflake. Not an RFC 4122 UUID.
Pattern: ^[0-9A-HJ-NP-Za-km-z]{9,16}$

Response

NameDescription

Errors

StatusDescriptionBody
403You do not have permission to perform this action
404No user group with this id exists in the resolved tenant. Check the id, and where the caller's access spans several tenants that X-Tenant-Id names the right one.
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
400The request did not match the schema for this endpoint. The details field carries the specific failures.error: Validation Error
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50

Add roles to a group

Takes two rights, not one: update on the group and share on every role named — the role reaches everyone already in the group at once.

POST/api/v1/usergroup/Yk3pL7rWq2/roles

Path Parameters

NameDescription
usergroupIdstringResource id: Base58 (9–10 characters) or a 16-character Crockford snowflake. Not an RFC 4122 UUID.
Pattern: ^[0-9A-HJ-NP-Za-km-z]{9,16}$

Body

NameDescription
roleOne role CRN or a list of them, each in the same tenant as the group; a CRN naming another tenant is refused.
Alternative 1stringUnique Coldwave resource name (CRN) that identifies a resource
Alternative 2arrayOne role CRN or a list of them, each in the same tenant as the group; a CRN naming another tenant is refused.

Errors

StatusDescriptionBody
403You do not have permission to perform this action
404No user group with this id exists in the resolved tenant. Check the id, and where the caller's access spans several tenants that X-Tenant-Id names the right one.
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
400The request did not match the schema for this endpoint. The details field carries the specific failures.error: Validation Error
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50

Remove roles from a group

The same pair of rights as adding, update on the group and share on each role. Members lose the role immediately unless they also hold it directly or through another group.

DELETE/api/v1/usergroup/Yk3pL7rWq2/roles

Path Parameters

NameDescription
usergroupIdstringResource id: Base58 (9–10 characters) or a 16-character Crockford snowflake. Not an RFC 4122 UUID.
Pattern: ^[0-9A-HJ-NP-Za-km-z]{9,16}$

Body

NameDescription
roleOne role CRN or a list of them, each in the same tenant as the group; a CRN naming another tenant is refused.
Alternative 1stringUnique Coldwave resource name (CRN) that identifies a resource
Alternative 2arrayOne role CRN or a list of them, each in the same tenant as the group; a CRN naming another tenant is refused.

Errors

StatusDescriptionBody
403You do not have permission to perform this action
404No user group with this id exists in the resolved tenant. Check the id, and where the caller's access spans several tenants that X-Tenant-Id names the right one.
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
400The request did not match the schema for this endpoint. The details field carries the specific failures.error: Validation Error
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50

List the group's members

The CRNs of the accounts in the group. It takes read on the group itself, not on each account listed.

GET/api/v1/usergroup/Yk3pL7rWq2/users

Path Parameters

NameDescription
usergroupIdstringResource id: Base58 (9–10 characters) or a 16-character Crockford snowflake. Not an RFC 4122 UUID.
Pattern: ^[0-9A-HJ-NP-Za-km-z]{9,16}$

Response

NameDescription

Errors

StatusDescriptionBody
403You do not have permission to perform this action
404No user group with this id exists in the resolved tenant. Check the id, and where the caller's access spans several tenants that X-Tenant-Id names the right one.
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
400The request did not match the schema for this endpoint. The details field carries the specific failures.error: Validation Error
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50

Add members to a group

Takes share on the group and read on every account named — deliberately not share on the group's roles, which is what lets a group administrator hand out a bundle they could not have assembled by hand.

POST/api/v1/usergroup/Yk3pL7rWq2/users

Path Parameters

NameDescription
usergroupIdstringResource id: Base58 (9–10 characters) or a 16-character Crockford snowflake. Not an RFC 4122 UUID.
Pattern: ^[0-9A-HJ-NP-Za-km-z]{9,16}$

Body

NameDescription
userOne user CRN or a list of them, each in the same tenant as the group; a CRN naming another tenant is refused.
Alternative 1stringUnique Coldwave resource name (CRN) that identifies a resource
Alternative 2arrayOne user CRN or a list of them, each in the same tenant as the group; a CRN naming another tenant is refused.

Errors

StatusDescriptionBody
403You do not have permission to perform this action
404No user group with this id exists in the resolved tenant. Check the id, and where the caller's access spans several tenants that X-Tenant-Id names the right one.
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
400The request did not match the schema for this endpoint. The details field carries the specific failures.error: Validation Error
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50

Remove members from a group

The same rights as adding a member. Whoever is taken out loses every role the group carried, unless they hold it by another path.

DELETE/api/v1/usergroup/Yk3pL7rWq2/users

Path Parameters

NameDescription
usergroupIdstringResource id: Base58 (9–10 characters) or a 16-character Crockford snowflake. Not an RFC 4122 UUID.
Pattern: ^[0-9A-HJ-NP-Za-km-z]{9,16}$

Body

NameDescription
userOne user CRN or a list of them, each in the same tenant as the group; a CRN naming another tenant is refused.
Alternative 1stringUnique Coldwave resource name (CRN) that identifies a resource
Alternative 2arrayOne user CRN or a list of them, each in the same tenant as the group; a CRN naming another tenant is refused.

Errors

StatusDescriptionBody
403You do not have permission to perform this action
404No user group with this id exists in the resolved tenant. Check the id, and where the caller's access spans several tenants that X-Tenant-Id names the right one.
409A tenant with the given name already existscode: IAM_TENANT_CONFLICT_ERROR
400The request did not match the schema for this endpoint. The details field carries the specific failures.error: Validation Error
401No valid access token was presented, or the DPoP proof accompanying it was missing, expired or bound to a different key.error: string
500The request failed for a reason that is not the caller's to fix. Safe to retry.error: string, message: string, statusCode: 50