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
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.

Exemple de data
{
  "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.

Exemple de data
{
  "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.

Exemple de data
{
  "app_id": "clxxxappxxxxxxxxxxxxxxxxx",
  "user": {
    "id": "usr_clxxxuserxxxxxxxxxxxxxx"
  }
}

user.blocked

Un utilisateur a été bloqué, avec votre motif.

Exemple de data
{
  "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.

Exemple de data
{
  "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é.

Exemple de data
{
  "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 :

MotifSignification
logoutl’utilisateur s’est déconnecté
refresh_reuseun ancien jeton de renouvellement a été réutilisé, donc toute la session a été révoquée
revokedvotre serveur a révoqué le jeton de renouvellement à /revoke
refresh_refusedun renouvellement a été refusé, par exemple après un retrait de l’organisation
not_mel’utilisateur a cliqué sur « Ce n’était pas moi » dans une alerte de nouvel appareil
apivous l’avez révoquée par l’API ou le tableau de bord
user_blockedl’utilisateur a été bloqué
method_changedune méthode de connexion a été ajoutée, changée ou retirée
staffle personnel de HonkIO y a mis fin
hostname_changedl’application est passée à un nouveau nom d’hôte, donc son émetteur a changé
Exemple de data
{
  "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.

Exemple de data
{
  "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é.

Exemple de data
{
  "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.

Exemple de data
{
  "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.

Exemple de data
{
  "app_id": "clxxxappxxxxxxxxxxxxxxxxx",
  "membership": {
    "organization_id": "org_clxxxorgxxxxxxxxxxxxxxx",
    "user_id": "usr_clxxxuserxxxxxxxxxxxxxx",
    "role": "member"
  }
}

membership.updated

Le rôle d’un membre a changé.

Exemple de data
{
  "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.

Exemple de data
{
  "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.

Exemple de data
{
  "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.

Exemple de data
{
  "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.

Exemple de data
{
  "app_id": "clxxxappxxxxxxxxxxxxxxxxx",
  "trigger": "auto",
  "started_at": "2026-11-02T15:04:05.000Z"
}

app.attack_mode.ended

Le mode attaque a pris fin.

Exemple de data
{
  "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.

Exemple de data
{
  "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.

Exemple de data
{
  "app_id": "clxxxappxxxxxxxxxxxxxxxxx",
  "limit_cents": 500,
  "spent_cents": 503,
  "day": "2026-11-02"
}