Rapport des membres inactifs
GET /v1/reports/inactive-members · autorisation reports:read
Liste les membres actifs d'une organisation qui n'ont eu aucune connexion réussie dans cette organisation au cours des days derniers jours. Utilisez-le pour repérer les comptes à supprimer lorsqu'une connexion ne dispose pas de provisionnement SCIM : examinez la liste, puis suspendez les adhésions sélectionnées avec POST /v1/organizations/{org_id}/memberships/{membership_id}:suspend.
L'environnement provient toujours de la clé d'API ; il n'existe aucun paramètre d'environnement. Les lignes ne contiennent que des identifiants et des horodatages, sans nom, adresse e-mail, adresse IP ni User-Agent. Les identifiants d'utilisateur étant des données personnelles, le rapport est limité aux clés disposant de reports:read.
Ce qui compte comme connexion
Une authentification réussie compte lorsqu'elle a été effectuée dans le contexte de cette organisation. Une connexion effectuée sans organisation sélectionnée ne compte pas. Une adhésion dont l'activation (activated_at, ou sa date de création si elle n'a jamais été activée) est postérieure au seuil n'est pas listée ; ainsi, un membre arrivé hier n'apparaît jamais dans un rapport de 30 jours.
Requête
| Paramètre | Dans | Requis | Description |
|---|---|---|---|
organization_id |
query | oui | L'organisation (org_…). |
days |
query | non | Seuil d'inactivité en jours, de 7 à 365. Valeur par défaut : 30. |
limit |
query | non | Taille de page, de 1 à 100. Valeur par défaut : 50. |
cursor |
query | non | next_cursor de la page précédente. Valide uniquement pour l'environnement, organization_id et days pour lesquels il a été émis. |
Les lignes suivent l'ordre de la dernière mise à jour des adhésions. Le seuil (inactive_since) est calculé une seule fois, sur la première page, et transporté dans le curseur ; ainsi, toutes les pages d'un même rapport utilisent le même instant.
Une page analyse au plus 500 adhésions et peut renvoyer moins de lignes que limit, voire aucune. Continuez à suivre next_cursor jusqu'à ce qu'il soit null.
Réponse
200 OK.
| Champ | Description |
|---|---|
organization_id |
L'organisation du rapport. |
days |
Le seuil utilisé. |
inactive_since |
L'instant du seuil (heure de la requête moins days, RFC 3339, UTC). Les membres sans connexion depuis cet instant sont listés. |
data_since |
Heure de la première authentification réussie enregistrée pour l'environnement ; les connexions antérieures sont inconnues. null lorsque l'environnement n'a encore aucun enregistrement. |
complete |
true lorsque data_since n'est pas postérieur à inactive_since, de sorte que la liste couvre toute la fenêtre du seuil. |
data |
Les lignes de cette page (voir ci-dessous). |
next_cursor |
Curseur de la page suivante, null sur la dernière page. |
Chaque ligne de data :
| Champ | Description |
|---|---|
membership_id |
mem_…. |
user_id |
usr_…. |
activated_at |
Date d'activation de l'adhésion (sa date de création si elle n'a jamais été activée). |
last_authenticated_at |
Dernière authentification réussie dans cette organisation, ou null si aucune n'a été enregistrée depuis data_since. |
Lorsque complete est false, un membre listé peut s'être connecté avant data_since ; ne considérez donc pas la liste comme définitive. Lorsque data_since est null, aucune connexion n'a encore été enregistrée pour l'environnement et tous les membres suffisamment anciens sont listés.
{
"organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4d",
"days": 30,
"inactive_since": "2027-02-03T09:30:00Z",
"data_since": "2026-12-01T08:00:00Z",
"complete": true,
"data": [
{
"membership_id": "mem_01j9xk3m7q8r2s4t6v8w0y2z4e",
"user_id": "usr_01j9xk3m7q8r2s4t6v8w0y2z4f",
"activated_at": "2026-12-10T10:00:00Z",
"last_authenticated_at": "2027-01-05T17:45:00Z"
}
],
"next_cursor": null
}
Erreurs
Chaque erreur renvoie un corps application/problem+json avec un code stable.
| HTTP | code |
Quand |
|---|---|---|
| 400 | invalid_cursor |
Le curseur est mal formé ou a été émis pour un autre environnement, une autre organisation ou days. |
| 404 | not_found |
L'organisation n'existe pas ou appartient à un autre environnement. |
| 422 | validation_failed |
organization_id est absent ou mal formé, days ou limit est hors plage, ou un paramètre est répété. |
| 401 | unauthenticated |
La clé d'API est absente, invalide ou révoquée. |
| 403 | insufficient_permissions |
La clé ne dispose pas de reports:read. |
| 429 | rate_limited |
La limite de débit a été dépassée ; respectez Retry-After. |
| 503 | service_unavailable |
Le service de génération de rapports est temporairement indisponible ; réessayez plus tard. |
Exemple
curl "https://api.eu.keenauth.com/v1/reports/inactive-members?organization_id=org_01j9xk3m7q8r2s4t6v8w0y2z4d&days=60" \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
keenauth reports inactive-members org_01j9xk3m7q8r2s4t6v8w0y2z4d --days 60
Données personnelles
Ce point de terminaison traite des données personnelles : adhésions et invitations à une organisation (identifiants d'utilisateur et d'adhésion avec horodatages de connexion). Données personnelles dans les API KeenAuth décrit les données conservées, leur durée de conservation et leur suppression. N'envoyez aucune catégorie particulière de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.