HonkIO Auth
Événements webhook d’Auth
Dix-neuf événements pour les utilisateurs, les sessions, les organisations et la sécurité, livrés par vos webhooks HonkIO existants.
Abonnement
Les événements de HonkIO Auth passent par les webhooks existants de votre compte : même signature avec X-HonkIO-Signature et X-HonkIO-Timestamp (Signature), mêmes nouvelles tentatives et même file des échecs (Nouvelles tentatives). Abonnez-vous-y comme à tout autre événement :
curl -X POST https://api.honkio.ca/v1/webhooks \
-H "Authorization: Bearer mk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://app.acme.ca/hooks/honkio",
"events": ["user.created", "user.deleted", "session.revoked", "membership.deleted"]
}'Le data de chaque événement porte app_id, et livemode suit le mode de l’application. Les contenus ne renferment jamais de codes, de jetons, de clés ni de secrets. La clé d’API qui crée un webhook pour ces événements, ou qui en change l’URL, doit aussi pouvoir lire leurs données : auth_users pour les événements d’utilisateur, de session, de connexion et d’inscription, auth_organizations pour les événements d’organisation et d’adhésion, et auth_apps pour les événements d’application. Une clé qui ne le peut pas reçoit 403 FORBIDDEN et voit les lettres mortes de ces événements sans leur contenu.
Événements d’utilisateur
user.created
Un utilisateur s’est inscrit, ou a accepté une invitation en tant que nouvel utilisateur.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"user": {
"id": "usr_clxxxuserxxxxxxxxxxxxxx",
"email": "ada@example.com",
"email_verified": true,
"phone": null,
"phone_verified": false,
"name": "Ada Lovelace",
"blocked": false,
"created_at": "2026-11-02T15:04:05.000Z",
"last_sign_in_at": "2026-11-02T15:04:05.000Z"
}
}user.updated
Le profil ou les méthodes de connexion d’un utilisateur ont changé; changes nomme les champs.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"user": {
"id": "usr_clxxxuserxxxxxxxxxxxxxx",
"email": "ada@example.com",
"email_verified": true,
"phone": "+1416XXXXXXX",
"phone_verified": true,
"name": "Ada Lovelace",
"blocked": false,
"created_at": "2026-11-02T15:04:05.000Z",
"last_sign_in_at": "2026-11-02T15:04:05.000Z"
},
"changes": [
"phone"
]
}user.deleted
Un utilisateur a été supprimé. Seul l’identifiant reste.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"user": {
"id": "usr_clxxxuserxxxxxxxxxxxxxx"
}
}user.blocked
Un utilisateur a été bloqué, avec votre motif.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"user": {
"id": "usr_clxxxuserxxxxxxxxxxxxxx",
"email": "ada@example.com",
"email_verified": true,
"phone": null,
"phone_verified": false,
"name": "Ada Lovelace",
"blocked": true,
"created_at": "2026-11-02T15:04:05.000Z",
"last_sign_in_at": "2026-11-02T15:04:05.000Z"
},
"reason": "Chargeback fraud"
}user.locked
L’identifiant d’un utilisateur existant a été bloqué après trop de codes erronés, jusqu’à locked_until. Les liens et les clés d’accès fonctionnent toujours.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"user_id": "usr_clxxxuserxxxxxxxxxxxxxx",
"locked_until": "2026-11-02T16:04:05.000Z"
}Événements de session
session.created
Un utilisateur s’est connecté.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"session": {
"id": "ses_xxxxxxxxxxxxxxxxxxxxxx",
"user_id": "usr_clxxxuserxxxxxxxxxxxxxx",
"amr": [
"otp"
],
"organization_id": null,
"created_at": "2026-11-02T15:04:05.000Z",
"expires_at": "2026-12-02T15:04:05.000Z"
}
}session.revoked
Une session a pris fin avant son expiration.
reason vaut l’une de ces valeurs :
| Motif | Signification |
|---|---|
| logout | l’utilisateur s’est déconnecté |
| refresh_reuse | un ancien jeton de renouvellement a été réutilisé, donc toute la session a été révoquée |
| revoked | votre serveur a révoqué le jeton de renouvellement à /revoke |
| refresh_refused | un renouvellement a été refusé, par exemple après un retrait de l’organisation |
| not_me | l’utilisateur a cliqué sur « Ce n’était pas moi » dans une alerte de nouvel appareil |
| api | vous l’avez révoquée par l’API ou le tableau de bord |
| user_blocked | l’utilisateur a été bloqué |
| method_changed | une méthode de connexion a été ajoutée, changée ou retirée |
| staff | le personnel de HonkIO y a mis fin |
| hostname_changed | l’application est passée à un nouveau nom d’hôte, donc son émetteur a changé |
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"session": {
"id": "ses_xxxxxxxxxxxxxxxxxxxxxx",
"user_id": "usr_clxxxuserxxxxxxxxxxxxxx",
"amr": [
"otp"
],
"organization_id": null,
"created_at": "2026-11-02T15:04:05.000Z",
"expires_at": "2026-12-02T15:04:05.000Z"
},
"reason": "logout"
}Événements d’organisation
organization.created
Une organisation a été créée.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"organization": {
"id": "org_clxxxorgxxxxxxxxxxxxxxx",
"name": "Northwind",
"slug": "northwind",
"created_at": "2026-11-02T15:04:05.000Z"
}
}organization.updated
Une organisation a été renommée ou ses réglages ont changé.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"organization": {
"id": "org_clxxxorgxxxxxxxxxxxxxxx",
"name": "Northwind Traders",
"slug": "northwind",
"created_at": "2026-11-02T15:04:05.000Z"
}
}organization.deleted
Une organisation a été supprimée.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"organization": {
"id": "org_clxxxorgxxxxxxxxxxxxxxx",
"name": "Northwind",
"slug": "northwind",
"created_at": "2026-11-02T15:04:05.000Z"
}
}membership.created
Un utilisateur a rejoint une organisation.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"membership": {
"organization_id": "org_clxxxorgxxxxxxxxxxxxxxx",
"user_id": "usr_clxxxuserxxxxxxxxxxxxxx",
"role": "member"
}
}membership.updated
Le rôle d’un membre a changé.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"membership": {
"organization_id": "org_clxxxorgxxxxxxxxxxxxxxx",
"user_id": "usr_clxxxuserxxxxxxxxxxxxxx",
"role": "admin"
}
}membership.deleted
Un utilisateur a quitté une organisation ou en a été retiré. Envoyé immédiatement; son prochain renouvellement dans celle-ci échoue.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"membership": {
"organization_id": "org_clxxxorgxxxxxxxxxxxxxxx",
"user_id": "usr_clxxxuserxxxxxxxxxxxxxx",
"role": "member"
}
}Événements de sécurité
signin.suspicious
Une connexion risquée a fait l’objet d’un défi ou d’un signalement.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"user_id": "usr_clxxxuserxxxxxxxxxxxxxx",
"risk_level": "high",
"reasons": [
"datacenter_network",
"new_device"
],
"new_device": true,
"flagged": true
}signup.blocked
Des inscriptions ont été bloquées dans la dernière minute : un total par motif, envoyé au plus une fois par minute.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"window_start": "2026-11-02T15:04:00.000Z",
"window_end": "2026-11-02T15:05:00.000Z",
"count": 42,
"reasons": {
"throwaway_email": 30,
"risk": 12
}
}app.attack_mode.started
L’application est passée en mode attaque, automatiquement ou manuellement.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"trigger": "auto",
"started_at": "2026-11-02T15:04:05.000Z"
}app.attack_mode.ended
Le mode attaque a pris fin.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"trigger": "auto",
"started_at": "2026-11-02T15:04:05.000Z",
"ended_at": "2026-11-02T17:30:00.000Z"
}app.updated
L’application est passée à un nouveau nom d’hôte (PATCH avec hostname) : changes vaut ["hostname"], avec le nouveau hostname et le nouvel issuer, les previous_hostname et previous_issuer, le nombre de sessions fermées et le nombre de clés d’accès retirées.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"changes": [
"hostname"
],
"hostname": "auth.acme.ca",
"issuer": "https://auth.acme.ca",
"previous_hostname": "login.acme.ca",
"previous_issuer": "https://login.acme.ca",
"sessions_revoked": 42,
"passkeys_retired": 0
}sms.spend_limit_reached
La limite quotidienne de dépenses en textos a été atteinte et la connexion par texto a été suspendue.
{
"app_id": "clxxxappxxxxxxxxxxxxxxxxx",
"limit_cents": 500,
"spent_cents": 503,
"day": "2026-11-02"
}
HonkIO