Additional info
Analytics events
Event names, payload shapes, and when they are emitted by core and plugins.
UsefulKey emits audit/analytics events using the configured AnalyticsAdapter.
Core events
key.created{ keyId, userId, ts }
key.verified{ keyId, userId, identifier, ts }
key.revoked{ keyId, ts }
key.hard_removed{ keyId, ts }
key.expiry_extended{ keyId, from, to, deltaMs, ts }
keys.expired_swept{ processed, revoked, hardRemoved, olderThan, strategy, ts }
Rate limit plugin
ratelimit.blocked{ kind: "fixed" | "tokenBucket", namespace, identifier, reset, limit?, capacity?, remaining, ts }
Usage limits per key plugin
usage.blocked{ keyId, userId, remaining: 0, ts }
usage.decremented{ keyId, userId, remaining, ts }
usage.set{ keyId, userId, remaining, ts }
usage.topped_up{ keyId, userId, added, remaining, ts }
usage.cleared{ keyId, userId, ts }
Permissions / scopes plugin
scopes.blocked{ keyId, userId, required: string[], have: string[] | string, ts }
scopes.granted{ keyId, added: string[], result: string[], ts }
scopes.revoked{ keyId, removed: string[], result: string[], ts }
scopes.set{ keyId, result: string[], ts }
Enable / disable plugin
key.disabled{ keyId, ts }
key.enabled{ keyId, ts }
IP access control plugin
ip_access.blocked{ ip, rule: "deny" | "allow_list_missing", plugin: "ip-access-control:memory" | "ip-access-control:static", ts }
Notes
- Timestamps (
ts) are epoch milliseconds. - Payloads may include
userIdwhen available on the key record. - Use a production adapter to forward events to your observability stack (e.g., ClickHouse, Kafka, or your analytics service).