Skip to content

IAM

This is an englisch preview of the IAM module.

IAM

Sections

Events

Published on the tenant's event stream and delivered over the websocket to every subscriber holding read on the resource the message names. resourceIdentifier is the resource the action changed; the payload is the shape below.

EventDescription
IAM_ROLE_CREATEA role was created, with the access rules it grants its holders.
IAM_ROLE_DELETEA role was removed; every user paired to it was unpaired first and lost the access it granted.
IAM_ROLE_PAIR_USEROne or more accounts were paired to a role and hold its access from that moment.
IAM_ROLE_REPLACEA role was overwritten as a whole — anything not repeated in the write is gone.
IAM_ROLE_UNPAIR_USEROne or more accounts were unpaired from a role and lost the access it granted.
IAM_ROLE_UPDATEFields of a role were written; a present access replaced the whole rule set.
IAM_SIGNING_KEY_REGISTERThe public half of a JWT signing key was recorded at boot, so every instance can verify against it and the JWKS endpoint can publish it. Rotation adds an entry rather than replacing one, which keeps older tokens verifiable.
IAM_TENANT_CREATEA tenant was created, with the rootAccess ceiling every rule inside it is held to and the reference to its password pepper.
IAM_TENANT_DELETEA tenant entry was removed and the origins it had registered for browser requests were released.
IAM_TENANT_REPLACEA tenant was overwritten as a whole; fields left out fell back to their defaults, apart from passwordSecret and createdBy, which were carried over.
IAM_TENANT_UPDATEFields of a tenant were written; a changed allowedOrigins re-registered which origins may reach the tenant from a browser.
IAM_USER_CHANGE_EMAILAn account was pointed at a new address, which starts out unverified.
IAM_USER_CONSUME_CLAIM_CODEA tenant claim code was removed and no longer admits a registration.
IAM_USER_CONSUME_EMAIL_VERIFICATIONA verification code was used up and cannot be presented a second time.
IAM_USER_CONSUME_INVITEAn invitation was redeemed: the account it named now exists and the code stopped working.
IAM_USER_CONSUME_PASSWORD_RESETA password-reset token was used up and cannot be presented a second time.
IAM_USER_CREATEAn account was created by redeeming an invite or a claim code. invitedBy names what admitted it, where anything did — a broadcast tenant claim code leaves it unset.
IAM_USER_CREATE_CLAIM_CODEA tenant claim code was minted; only its hash is stored, and it may carry a role every signup with it joins.
IAM_USER_CREATE_EMAIL_VERIFICATIONA verification code was issued for an address. The plaintext goes into the mail and nowhere else — only its hash is stored.
IAM_USER_CREATE_PASSWORD_RESETA password-reset token was issued. The plaintext travels in the mailed link and nowhere else — only its hash is stored.
IAM_USER_CREATE_PENDINGAn invitation was minted, carrying the access, roles and groups the account receives when the code is redeemed.
IAM_USER_DELETEAn account was removed, its email address released for a new signup and its role pairings dropped.
IAM_USER_ENROLL_TOTPA TOTP secret was stored as the account's second factor, with its set of backup codes. The same event carries the shortened set after a backup code has been spent.
IAM_USER_ENROLL_WEBAUTHN_CREDENTIALA WebAuthn credential was registered on an account, which may hold several of them.
IAM_USER_REMOVE_TOTPAn account's TOTP secret and its backup codes were dropped.
IAM_USER_REMOVE_WEBAUTHN_CREDENTIALOne WebAuthn credential was removed; the factor itself goes with its last credential.
IAM_USER_REVOKE_INVITEAn outstanding invitation was withdrawn without an account being created — kept apart from redemption, which ends in the same deletion.
IAM_USER_SEND_INVITEAn invitation mail was triggered; it carries the plaintext code and the signup link, and stays inside the instance that raised it.
IAM_USER_SET_PASSWORDAn account's password hash was replaced — by a change, by a reset, or by a rehash under a rotated pepper. The hash, salt and pepper version are kept off the event bus.
IAM_USER_SET_PASSWORD_INDICATIONA password change worth telling the account holder about was made. A rehash under a rotated pepper deliberately does not raise this — the password itself did not change.
IAM_USER_UPDATEAn account's own access rules or its enforce2FA flag were written.
IAM_USER_UPDATE_WEBAUTHN_SIGN_COUNTA WebAuthn credential's signature counter was updated after a successful assertion.
IAM_USER_VERIFY_EMAILAn account's address was confirmed by the code from the verification mail.
IAM_USERGROUP_CREATEA user group was created; it starts out with neither roles nor members.
IAM_USERGROUP_DELETEA group was removed after its roles and its members were unlinked, so everyone in it lost what it granted.
IAM_USERGROUP_PAIR_ROLEOne or more roles were put into a group and reached everyone already in it.
IAM_USERGROUP_PAIR_USEROne or more accounts joined a group and hold every role it carries.
IAM_USERGROUP_UNPAIR_ROLEOne or more roles were taken out of a group; its members lost them unless they hold them by another path.
IAM_USERGROUP_UNPAIR_USEROne or more accounts left a group and lost the roles it carried.
IAM_USERGROUP_UPDATEA group's name or description was written; its roles and members were untouched.

Role created

A role was created, with the access rules it grants its holders.

EVENTIAM_ROLE_CREATE

Payload

NameDescription
namestringDisplay name of the role
min length 1 · max length 64
descriptionstringoptionalHuman-readable description of the role's purpose
accessarrayoptionalAccess policies assigned to members of this role
Default: []
identifierThe resource this policy applies to
Alternative 1Resource identifier pattern (CRN), may include wildcards
Alternative 2Resource identifier pattern (CRN), may include wildcards
Alternative 3Resource identifier pattern (CRN), may include wildcards
Alternative 4Resource identifier pattern (CRN), may include wildcards
Alternative 5Resource identifier pattern (CRN), may include wildcards
Alternative 6Resource identifier pattern (CRN), may include wildcards
effectenumAccess policy effect — either allow or deny
Possible values: deny, allow
actionsarrayList of actions permitted by this policy
policyobjectoptionalAdditional constraints for this access policy
enforce2FAbooleanoptionalRequires the subject to have 2FA active before this access is granted
targetoptionalWhere a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Alternative 1Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Possible values: user, role, group
Alternative 2Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
isOwnerbooleanoptionalMarks an owner-relative rule, written as crn#tenant:<id>.user:* and rebound to the holder's own account when the access list is assembled — how a shared role says "your own account" without naming anyone.
require2FAbooleanoptionalWhether members of this role must have two-factor authentication enabled
Default: false
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
createdBystringResource identifier of the entity that created this resource

Role deleted

A role was removed; every user paired to it was unpaired first and lost the access it granted.

EVENTIAM_ROLE_DELETE

Payload

NameDescription

Users added to a role

One or more accounts were paired to a role and hold its access from that moment.

EVENTIAM_ROLE_PAIR_USER

Payload

NameDescription
userThe users being added to or removed from the role or user group, as one CRN or an array of them.
Alternative 1stringUnique Coldwave resource name (CRN) that identifies a resource
Alternative 2arrayThe users being added to or removed from the role or user group, as one CRN or an array of them.

Role replaced

A role was overwritten as a whole — anything not repeated in the write is gone.

EVENTIAM_ROLE_REPLACE

Payload

NameDescription
namestringDisplay name of the role
min length 1 · max length 64
descriptionstringoptionalHuman-readable description of the role's purpose
accessarrayoptionalAccess policies assigned to members of this role
Default: []
identifierThe resource this policy applies to
Alternative 1Resource identifier pattern (CRN), may include wildcards
Alternative 2Resource identifier pattern (CRN), may include wildcards
Alternative 3Resource identifier pattern (CRN), may include wildcards
Alternative 4Resource identifier pattern (CRN), may include wildcards
Alternative 5Resource identifier pattern (CRN), may include wildcards
Alternative 6Resource identifier pattern (CRN), may include wildcards
effectenumAccess policy effect — either allow or deny
Possible values: deny, allow
actionsarrayList of actions permitted by this policy
policyobjectoptionalAdditional constraints for this access policy
enforce2FAbooleanoptionalRequires the subject to have 2FA active before this access is granted
targetoptionalWhere a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Alternative 1Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Possible values: user, role, group
Alternative 2Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
isOwnerbooleanoptionalMarks an owner-relative rule, written as crn#tenant:<id>.user:* and rebound to the holder's own account when the access list is assembled — how a shared role says "your own account" without naming anyone.
require2FAbooleanoptionalWhether members of this role must have two-factor authentication enabled
Default: false
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
createdBystringResource identifier of the entity that created this resource

Users removed from a role

One or more accounts were unpaired from a role and lost the access it granted.

EVENTIAM_ROLE_UNPAIR_USER

Payload

NameDescription
userThe users being added to or removed from the role or user group, as one CRN or an array of them.
Alternative 1stringUnique Coldwave resource name (CRN) that identifies a resource
Alternative 2arrayThe users being added to or removed from the role or user group, as one CRN or an array of them.

Role updated

Fields of a role were written; a present access replaced the whole rule set.

EVENTIAM_ROLE_UPDATE

Payload

NameDescription
namestringoptionalNew display name for the role
min length 1 · max length 64
descriptionstringoptionalUpdated description of the role's purpose
accessarrayoptionalReplacement access policies for this role — replaces the existing set
identifierThe resource this policy applies to
Alternative 1Resource identifier pattern (CRN), may include wildcards
Alternative 2Resource identifier pattern (CRN), may include wildcards
Alternative 3Resource identifier pattern (CRN), may include wildcards
Alternative 4Resource identifier pattern (CRN), may include wildcards
Alternative 5Resource identifier pattern (CRN), may include wildcards
Alternative 6Resource identifier pattern (CRN), may include wildcards
effectenumAccess policy effect — either allow or deny
Possible values: deny, allow
actionsarrayList of actions permitted by this policy
policyobjectoptionalAdditional constraints for this access policy
enforce2FAbooleanoptionalRequires the subject to have 2FA active before this access is granted
targetoptionalWhere a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Alternative 1Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Possible values: user, role, group
Alternative 2Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
isOwnerbooleanoptionalMarks an owner-relative rule, written as crn#tenant:<id>.user:* and rebound to the holder's own account when the access list is assembled — how a shared role says "your own account" without naming anyone.
require2FAbooleanoptionalWhether members of this role must have two-factor authentication enabled

Signing key published

The public half of a JWT signing key was recorded at boot, so every instance can verify against it and the JWKS endpoint can publish it. Rotation adds an entry rather than replacing one, which keeps older tokens verifiable.

EVENTIAM_SIGNING_KEY_REGISTER

Payload

NameDescription
kidstringKey id of the signing key: its JWK thumbprint per RFC 7638, and what the kid header of an issued token carries.
min length 1
jwkobjectThe public half of the token signing key as a JWK; the private half never leaves the secrets store.
ktyKey type; always EC.
crvCurve; always P-256, the curve of the ES256 tokens this backend issues.
xstringBase64url of the public point's x coordinate.
min length 1
ystringBase64url of the public point's y coordinate.
min length 1
createdAtstring
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource

Tenant created

A tenant was created, with the rootAccess ceiling every rule inside it is held to and the reference to its password pepper.

EVENTIAM_TENANT_CREATE

Payload

NameDescription
enforce2FAbooleanoptionalWhether all users in this tenant are required to enrol in two-factor authentication
Default: true
rootAccessarrayAccess policies that apply at the root scope of this tenant
identifierThe resource this policy applies to
Alternative 1Resource identifier pattern (CRN), may include wildcards
Alternative 2Resource identifier pattern (CRN), may include wildcards
Alternative 3Resource identifier pattern (CRN), may include wildcards
Alternative 4Resource identifier pattern (CRN), may include wildcards
Alternative 5Resource identifier pattern (CRN), may include wildcards
Alternative 6Resource identifier pattern (CRN), may include wildcards
effectenumAccess policy effect — either allow or deny
Possible values: deny, allow
actionsarrayList of actions permitted by this policy
policyobjectoptionalAdditional constraints for this access policy
enforce2FAbooleanoptionalRequires the subject to have 2FA active before this access is granted
targetoptionalWhere a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Alternative 1Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Possible values: user, role, group
Alternative 2Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
isOwnerbooleanoptionalMarks an owner-relative rule, written as crn#tenant:<id>.user:* and rebound to the holder's own account when the access list is assembled — how a shared role says "your own account" without naming anyone.
namestringShort alphanumeric tenant identifier (slug)
Pattern: ^\w{4,16}$
allowedOriginsarrayoptionalList of origins permitted to make cross-origin requests to this tenant
Default: []
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
passwordSecretoptionalCustom secret used to pepper password hashes for this tenant
createdBystringResource identifier of the entity that created this resource

Tenant deleted

A tenant entry was removed and the origins it had registered for browser requests were released.

EVENTIAM_TENANT_DELETE

Payload

NameDescription

Tenant replaced

A tenant was overwritten as a whole; fields left out fell back to their defaults, apart from passwordSecret and createdBy, which were carried over.

EVENTIAM_TENANT_REPLACE

Payload

NameDescription
enforce2FAbooleanoptionalWhether all users in this tenant are required to enrol in two-factor authentication
Default: true
rootAccessarrayAccess policies that apply at the root scope of this tenant
identifierThe resource this policy applies to
Alternative 1Resource identifier pattern (CRN), may include wildcards
Alternative 2Resource identifier pattern (CRN), may include wildcards
Alternative 3Resource identifier pattern (CRN), may include wildcards
Alternative 4Resource identifier pattern (CRN), may include wildcards
Alternative 5Resource identifier pattern (CRN), may include wildcards
Alternative 6Resource identifier pattern (CRN), may include wildcards
effectenumAccess policy effect — either allow or deny
Possible values: deny, allow
actionsarrayList of actions permitted by this policy
policyobjectoptionalAdditional constraints for this access policy
enforce2FAbooleanoptionalRequires the subject to have 2FA active before this access is granted
targetoptionalWhere a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Alternative 1Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Possible values: user, role, group
Alternative 2Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
isOwnerbooleanoptionalMarks an owner-relative rule, written as crn#tenant:<id>.user:* and rebound to the holder's own account when the access list is assembled — how a shared role says "your own account" without naming anyone.
namestringShort alphanumeric tenant identifier (slug)
Pattern: ^\w{4,16}$
allowedOriginsarrayoptionalList of origins permitted to make cross-origin requests to this tenant
Default: []
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
passwordSecretoptionalCustom secret used to pepper password hashes for this tenant
createdBystringResource identifier of the entity that created this resource

Tenant updated

Fields of a tenant were written; a changed allowedOrigins re-registered which origins may reach the tenant from a browser.

EVENTIAM_TENANT_UPDATE

Payload

NameDescription
namestringoptionalNew short identifier for the tenant
Pattern: ^\w{4,16}$
passwordSecretoptionalCustom secret used to pepper password hashes for this tenant
rootAccessarrayoptionalAccess policies that apply at the root scope of this tenant
identifierThe resource this policy applies to
Alternative 1Resource identifier pattern (CRN), may include wildcards
Alternative 2Resource identifier pattern (CRN), may include wildcards
Alternative 3Resource identifier pattern (CRN), may include wildcards
Alternative 4Resource identifier pattern (CRN), may include wildcards
Alternative 5Resource identifier pattern (CRN), may include wildcards
Alternative 6Resource identifier pattern (CRN), may include wildcards
effectenumAccess policy effect — either allow or deny
Possible values: deny, allow
actionsarrayList of actions permitted by this policy
policyobjectoptionalAdditional constraints for this access policy
enforce2FAbooleanoptionalRequires the subject to have 2FA active before this access is granted
targetoptionalWhere a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Alternative 1Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
Possible values: user, role, group
Alternative 2Where a device claimed under this rule lands: the kind of owner — user, role or group — or a CRN naming one outright. Only meaningful on a .pair rule.
isOwnerbooleanoptionalMarks an owner-relative rule, written as crn#tenant:<id>.user:* and rebound to the holder's own account when the access list is assembled — how a shared role says "your own account" without naming anyone.
enforce2FAbooleanoptionalWhether all users in this tenant are required to enrol in two-factor authentication
allowedOriginsarrayoptionalList of origins permitted to make cross-origin requests to this tenant

Email address changed

An account was pointed at a new address, which starts out unverified.

EVENTIAM_USER_CHANGE_EMAIL

Payload

NameDescription
emailstringThe account's email address; within one tenant at most one account may hold it.

Claim code removed

A tenant claim code was removed and no longer admits a registration.

EVENTIAM_USER_CONSUME_CLAIM_CODE

Payload

NameDescription

Verification code spent

A verification code was used up and cannot be presented a second time.

EVENTIAM_USER_CONSUME_EMAIL_VERIFICATION

Payload

NameDescription

Invite redeemed

An invitation was redeemed: the account it named now exists and the code stopped working.

EVENTIAM_USER_CONSUME_INVITE

Payload

NameDescription

Reset token spent

A password-reset token was used up and cannot be presented a second time.

EVENTIAM_USER_CONSUME_PASSWORD_RESET

Payload

NameDescription

User created

An account was created by redeeming an invite or a claim code. invitedBy names what admitted it, where anything did — a broadcast tenant claim code leaves it unset.

EVENTIAM_USER_CREATE

Payload

NameDescription
enforce2FAbooleanoptionalWhether two-factor authentication is required
Default: false
emailstringThe account's email address; within one tenant at most one account may hold it.
emailVerifiedbooleanoptionalWhether this email address has been verified
Default: false
accessarrayA resource access policy entry
identifierThe resource this policy applies to
Alternative 1Resource identifier pattern (CRN), may include wildcards
Alternative 2Resource identifier pattern (CRN), may include wildcards
Alternative 3Resource identifier pattern (CRN), may include wildcards
Alternative 4Resource identifier pattern (CRN), may include wildcards
Alternative 5Resource identifier pattern (CRN), may include wildcards
Alternative 6Resource identifier pattern (CRN), may include wildcards
effectenumAccess policy effect — either allow or deny
Possible values: deny, allow
actionsarrayList of actions permitted by this policy
policyobjectoptionalAdditional constraints for this access policy
enforce2FAbooleanoptionalRequires the subject to have 2FA active before this access is granted
targetoptionalNarrows a pair grant to where a claimed device may land: a kind — user, role or group — or one owner's CRN outright.
Alternative 1Narrows a pair grant to where a claimed device may land: a kind — user, role or group — or one owner's CRN outright.
Possible values: user, role, group
Alternative 2Narrows a pair grant to where a claimed device may land: a kind — user, role or group — or one owner's CRN outright.
isOwnerbooleanoptionalMarks an owner-relative rule on a shared role: the crn#tenant:*.user:* head is rebound to the holder's own CRN before the rule is evaluated, so every member reaches only their own resources.
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
saltstringoptionalRandom value used to salt the password hash
hashstringoptionalBcrypt password hash
pepperVersionstringoptionalWhich pepper the stored password hash was derived with; absent means the hash is unpeppered. Stripped from every response — it appears here only because the stored entity carries it.
twoFactorAutharrayoptionalTwo-factor authentication data for this user
Default: []
createdBystringUnique Coldwave resource name (CRN) that identifies a resource
invitedBystringoptionalWhat admitted the account — the user who sent the invitation, or the device whose claim code was redeemed. Absent when the invitation was addressed to nobody, as with a broadcast tenant claim code or an account created outright.

Claim code minted

A tenant claim code was minted; only its hash is stored, and it may carry a role every signup with it joins.

EVENTIAM_USER_CREATE_CLAIM_CODE

Payload

NameDescription
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
tenantRistringUnique Coldwave resource name (CRN) that identifies a resource
roleRistringoptionalCRN of the role a redeemed claim code joins. Absent on a code that grants no role.
expiresAtnumberWhen the code, token or invitation stops being redeemable, UTC epoch milliseconds. Past it the entry counts as absent rather than as expired: the pending list withholds it, and revoking or resending it answers 404.
createdBystringUnique Coldwave resource name (CRN) that identifies a resource

Verification code issued

A verification code was issued for an address. The plaintext goes into the mail and nowhere else — only its hash is stored.

EVENTIAM_USER_CREATE_EMAIL_VERIFICATION

Payload

NameDescription
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
userRistringUnique Coldwave resource name (CRN) that identifies a resource
emailstring
expiresAtnumberWhen the code, token or invitation stops being redeemable, UTC epoch milliseconds. Past it the entry counts as absent rather than as expired: the pending list withholds it, and revoking or resending it answers 404.
localestringoptional
codestringA verification code entry

Reset token issued

A password-reset token was issued. The plaintext travels in the mailed link and nowhere else — only its hash is stored.

EVENTIAM_USER_CREATE_PASSWORD_RESET

Payload

NameDescription
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
userRistringUnique Coldwave resource name (CRN) that identifies a resource
emailstring
expiresAtnumberWhen the code, token or invitation stops being redeemable, UTC epoch milliseconds. Past it the entry counts as absent rather than as expired: the pending list withholds it, and revoking or resending it answers 404.
localestringoptional
resetLinkstringThe password-reset link, token included. It goes to the mail template only — neither cache nor database keeps it, so it cannot be read back.
tenantNamestringThe tenant's name, for the tenant_name parameter of the invitation and reset mails; it falls back to the tenant id when the tenant record cannot be read.

Invite created

An invitation was minted, carrying the access, roles and groups the account receives when the code is redeemed.

EVENTIAM_USER_CREATE_PENDING

Payload

NameDescription
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource
tenantRistringUnique Coldwave resource name (CRN) that identifies a resource
futureUserRistringUnique Coldwave resource name (CRN) that identifies a resource
emailstring
accessarrayoptionalA resource access policy entry
Default: []
identifierThe resource this policy applies to
Alternative 1Resource identifier pattern (CRN), may include wildcards
Alternative 2Resource identifier pattern (CRN), may include wildcards
Alternative 3Resource identifier pattern (CRN), may include wildcards
Alternative 4Resource identifier pattern (CRN), may include wildcards
Alternative 5Resource identifier pattern (CRN), may include wildcards
Alternative 6Resource identifier pattern (CRN), may include wildcards
effectenumAccess policy effect — either allow or deny
Possible values: deny, allow
actionsarrayList of actions permitted by this policy
policyobjectoptionalAdditional constraints for this access policy
enforce2FAbooleanoptionalRequires the subject to have 2FA active before this access is granted
targetoptionalNarrows a pair grant to where a claimed device may land: a kind — user, role or group — or one owner's CRN outright.
Alternative 1Narrows a pair grant to where a claimed device may land: a kind — user, role or group — or one owner's CRN outright.
Possible values: user, role, group
Alternative 2Narrows a pair grant to where a claimed device may land: a kind — user, role or group — or one owner's CRN outright.
isOwnerbooleanoptionalMarks an owner-relative rule on a shared role: the crn#tenant:*.user:* head is rebound to the holder's own CRN before the rule is evaluated, so every member reaches only their own resources.
roleRisarraystringoptionalCRNs of the roles the account joins when the invitation is redeemed.
Default: []
usergroupRisarraystringoptionalCRNs of the user groups the account joins when the invitation is redeemed. A group is a bundle of roles and is granted whole — which is what lets an admin hand out a bundle they could not have assembled role by role.
Default: []
emailVerifiedbooleanoptionalWhether this email address has been verified
Default: false
expiresAtnumberWhen the code, token or invitation stops being redeemable, UTC epoch milliseconds. Past it the entry counts as absent rather than as expired: the pending list withholds it, and revoking or resending it answers 404.
createdBystringUnique Coldwave resource name (CRN) that identifies a resource

User deleted

An account was removed, its email address released for a new signup and its role pairings dropped.

EVENTIAM_USER_DELETE

Payload

NameDescription

TOTP factor stored

A TOTP secret was stored as the account's second factor, with its set of backup codes. The same event carries the shortened set after a backup code has been spent.

EVENTIAM_USER_ENROLL_TOTP

Payload

NameDescription
typeDiscriminator of the variant that follows — which answer a device gave, which second factor was enrolled, how a stored series is to be read. Read it before the fields beside it.
secretstringThe TOTP secret, encrypted with the tenant's pepper. Stripped from every response — enrolment hands out an otpauth:// URI instead, and the secret itself is never served.
backupCodesarraystringThe one-time backup codes, stored as hashes. Stripped from every response — the plaintext codes are returned once, when enrolment is confirmed, and cannot be listed again.
enrolledAtnumberWhen the second factor was enrolled, UTC epoch seconds — seconds here, unlike the milliseconds every other timestamp in the API uses.

WebAuthn credential enrolled

A WebAuthn credential was registered on an account, which may hold several of them.

EVENTIAM_USER_ENROLL_WEBAUTHN_CREDENTIAL

Payload

NameDescription
credentialIdstringId of the WebAuthn credential: base64url of the authenticator's raw credential id. It is what a removal names and what an assertion is matched against.
publicKeystringThe public key a signature is checked against: a device's Ed25519 key as 32 bytes of hex, or a WebAuthn authenticator's key as base64url.
signCountnumberThe authenticator's signature counter as of its last assertion. A later assertion has to report a higher one or the credential counts as cloned; authenticators that always report 0 are exempt.
transportsarraystringoptionalHow the authenticator can be reached, as the browser reported it at registration — values such as usb, nfc, ble or internal. It is handed back to the browser so it can prompt for the right one.
createdAtnumber

TOTP factor removed

An account's TOTP secret and its backup codes were dropped.

EVENTIAM_USER_REMOVE_TOTP

Payload

NameDescription

WebAuthn credential removed

One WebAuthn credential was removed; the factor itself goes with its last credential.

EVENTIAM_USER_REMOVE_WEBAUTHN_CREDENTIAL

Payload

NameDescription
credentialIdstringId of the WebAuthn credential: base64url of the authenticator's raw credential id. It is what a removal names and what an assertion is matched against.

Invite revoked

An outstanding invitation was withdrawn without an account being created — kept apart from redemption, which ends in the same deletion.

EVENTIAM_USER_REVOKE_INVITE

Payload

NameDescription

Invitation mailed

An invitation mail was triggered; it carries the plaintext code and the signup link, and stays inside the instance that raised it.

EVENTIAM_USER_SEND_INVITE

Payload

NameDescription
emailstring
codestringA verification code entry
inviteLinkstringThe invitation link, code included. It goes to the mail template only and is kept nowhere, so a lost invitation is replaced by minting a new code rather than resending this one.
tenantNamestringThe tenant's name, for the tenant_name parameter of the invitation and reset mails; it falls back to the tenant id when the tenant record cannot be read.
localestring

Password hash written

An account's password hash was replaced — by a change, by a reset, or by a rehash under a rotated pepper. The hash, salt and pepper version are kept off the event bus.

EVENTIAM_USER_SET_PASSWORD

Payload

NameDescription
saltstringoptionalRandom value used to salt the password hash
hashstringoptionalBcrypt password hash
pepperVersionstringoptionalWhich pepper the stored password hash was derived with; absent means the hash is unpeppered. Stripped from every response — it appears here only because the stored entity carries it.
resourceIdentifierstringUnique Coldwave resource name (CRN) that identifies a resource

Password change notified

A password change worth telling the account holder about was made. A rehash under a rotated pepper deliberately does not raise this — the password itself did not change.

EVENTIAM_USER_SET_PASSWORD_INDICATION

Payload

NameDescription
emailstring
localestring

User updated

An account's own access rules or its enforce2FA flag were written.

EVENTIAM_USER_UPDATE

Payload

NameDescription
accessarrayoptionalA resource access policy entry
identifierThe resource this policy applies to
Alternative 1Resource identifier pattern (CRN), may include wildcards
Alternative 2Resource identifier pattern (CRN), may include wildcards
Alternative 3Resource identifier pattern (CRN), may include wildcards
Alternative 4Resource identifier pattern (CRN), may include wildcards
Alternative 5Resource identifier pattern (CRN), may include wildcards
Alternative 6Resource identifier pattern (CRN), may include wildcards
effectenumAccess policy effect — either allow or deny
Possible values: deny, allow
actionsarrayList of actions permitted by this policy
policyobjectoptionalAdditional constraints for this access policy
enforce2FAbooleanoptionalRequires the subject to have 2FA active before this access is granted
targetoptionalNarrows a pair grant to where a claimed device may land: a kind — user, role or group — or one owner's CRN outright.
Alternative 1Narrows a pair grant to where a claimed device may land: a kind — user, role or group — or one owner's CRN outright.
Possible values: user, role, group
Alternative 2Narrows a pair grant to where a claimed device may land: a kind — user, role or group — or one owner's CRN outright.
isOwnerbooleanoptionalMarks an owner-relative rule on a shared role: the crn#tenant:*.user:* head is rebound to the holder's own CRN before the rule is evaluated, so every member reaches only their own resources.
enforce2FAbooleanoptionalWhether two-factor authentication is required

Signature counter advanced

A WebAuthn credential's signature counter was updated after a successful assertion.

EVENTIAM_USER_UPDATE_WEBAUTHN_SIGN_COUNT

Payload

NameDescription
credentialIdstringId of the WebAuthn credential: base64url of the authenticator's raw credential id. It is what a removal names and what an assertion is matched against.
signCountnumberThe authenticator's signature counter as of its last assertion. A later assertion has to report a higher one or the credential counts as cloned; authenticators that always report 0 are exempt.

Email address verified

An account's address was confirmed by the code from the verification mail.

EVENTIAM_USER_VERIFY_EMAIL

Payload

NameDescription

User group created

A user group was created; it starts out with neither roles nor members.

EVENTIAM_USERGROUP_CREATE

Payload

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

User group deleted

A group was removed after its roles and its members were unlinked, so everyone in it lost what it granted.

EVENTIAM_USERGROUP_DELETE

Payload

NameDescription

Roles added to a group

One or more roles were put into a group and reached everyone already in it.

EVENTIAM_USERGROUP_PAIR_ROLE

Payload

NameDescription
roleThe roles being added to or removed from the user group, as one CRN or an array of them.
Alternative 1stringUnique Coldwave resource name (CRN) that identifies a resource
Alternative 2arrayThe roles being added to or removed from the user group, as one CRN or an array of them.

Members added to a group

One or more accounts joined a group and hold every role it carries.

EVENTIAM_USERGROUP_PAIR_USER

Payload

NameDescription
userThe users being added to or removed from the role or user group, as one CRN or an array of them.
Alternative 1stringUnique Coldwave resource name (CRN) that identifies a resource
Alternative 2arrayThe users being added to or removed from the role or user group, as one CRN or an array of them.

Roles removed from a group

One or more roles were taken out of a group; its members lost them unless they hold them by another path.

EVENTIAM_USERGROUP_UNPAIR_ROLE

Payload

NameDescription
roleThe roles being added to or removed from the user group, as one CRN or an array of them.
Alternative 1stringUnique Coldwave resource name (CRN) that identifies a resource
Alternative 2arrayThe roles being added to or removed from the user group, as one CRN or an array of them.

Members removed from a group

One or more accounts left a group and lost the roles it carried.

EVENTIAM_USERGROUP_UNPAIR_USER

Payload

NameDescription
userThe users being added to or removed from the role or user group, as one CRN or an array of them.
Alternative 1stringUnique Coldwave resource name (CRN) that identifies a resource
Alternative 2arrayThe users being added to or removed from the role or user group, as one CRN or an array of them.

User group updated

A group's name or description was written; its roles and members were untouched.

EVENTIAM_USERGROUP_UPDATE

Payload

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.