FerrisKeyDocs

Trigger events

A webhook subscribes to the triggers it cares about. There are 38, grouped here by the resource they concern. FerrisKey 0.10.0 raises 33 of them. The other five are valid names, and a webhook can subscribe to them, but nothing in the server emits them yet.

Five triggers are never raised

user.role.unassigned, user.credentials.deleted, realm.created, client.role.created and client.role.updated accept a subscription and then stay silent. Removing a role from a user raises user.updated instead, with the role as data. Creating a client role raises role.created. A new realm has no webhook yet, since webhooks belong to a realm, so realm.created has nobody to tell. The descriptions below mark each of the five.

What each trigger puts in data is listed in Payload format.

User

TriggerDescription
user.createdA new user account was created, by an administrator or by self-registration
user.updatedA user’s profile was modified. Also raised, with the role as data, when a role is removed from the user
user.deletedA user account was deleted
user.bulk_deletedSeveral users were deleted in one batch
user.email_verifiedA user confirmed their email address
user.credentials.deletedA user’s credentials were removed. Not raised in 0.10.0
user.role.assignedA role was assigned to a user
user.role.unassignedA role was removed from a user. Not raised in 0.10.0

Authentication

TriggerDescription
auth.reset_passwordA password reset was completed
auth.device_flow.initiatedA device authorization flow was started
auth.device_flow.deniedThe user refused a device authorization
auth.device_flow.expiredA device code expired before anyone approved it

Client

TriggerDescription
client.createdA new OAuth2 client was registered
client.updatedA client’s configuration was modified
client.deletedA client was removed
client.role.createdA client-scoped role was created. Not raised in 0.10.0: role.created fires instead
client.role.updatedA client-scoped role was modified. Not raised in 0.10.0
client.maintenance.enabledMaintenance mode was turned on for the client
client.maintenance.disabledMaintenance mode was turned off
client.saml_config.updatedThe client’s SAML configuration changed
client.saml_attribute_mapper.createdA SAML attribute mapper was added
client.saml_attribute_mapper.deletedA SAML attribute mapper was removed

Redirect URIs and web origins

TriggerDescription
redirect_uri.createdA redirect URI was added to a client
redirect_uri.updatedA redirect URI was modified
redirect_uri.deletedA redirect URI was removed
web_origin.createdA web origin was added to a client
web_origin.deletedA web origin was removed

Roles

TriggerDescription
role.createdA new role was created, including a client-scoped role
role.updatedA role was modified
role.deletedA role was deleted. The console picker does not offer it, so subscribe through the API
role.permission.updatedA role’s permissions changed. The console picker does not offer it either

Realms

TriggerDescription
realm.createdA new realm was created. Not raised in 0.10.0
realm.updatedA realm was modified
realm.deletedA realm was deleted
realm.settings.updatedRealm settings were changed

Webhooks

TriggerDescription
webhook.createdA new webhook was registered
webhook.updatedA webhook was modified
webhook.deletedA webhook was removed

Yes, webhooks about webhooks

Subscribing to webhook lifecycle events is allowed, and it is the only way to audit changes to your webhook configuration from outside. The payload carries the webhook without its headers and secret.

Choosing what to subscribe to

Start narrow

Subscribe to what you need and nothing more. Every subscription is a network call on every matching event. user.created, user.deleted and client.deleted are a reasonable starting set.

Pair it with SeaWatch

Triggers and SeaWatch event types overlap without matching. SeaWatch records security audit events, including logins that failed. Webhooks push resource lifecycle events outward. Some questions need both: user.role.assigned carries the role but not the user, and the matching role_assigned event in SeaWatch names the user.

Ordering

Events fire in the order they happen within the realm, but delivery is asynchronous. A slow endpoint can receive a later event before it has acknowledged an earlier one, so write your handlers to be idempotent.