
# 非アクティブなメンバーのレポート

`GET /v1/reports/inactive-members` · 権限 `reports:read`

組織のアクティブなメンバーのうち、直近 `days` 日間にその組織でサインインに成功していないメンバーを一覧表示します。SCIM プロビジョニングが設定されていない接続で削除対象のアカウントを探す際に使用します。一覧を確認したうえで、`POST /v1/organizations/{org_id}/memberships/{membership_id}:suspend` を使って選択したメンバーシップを停止してください。

環境は常に API キーから取得されます。環境を指定するパラメータはありません。各行には識別子とタイムスタンプのみが含まれ、名前、メールアドレス、IP アドレス、`User-Agent` は含まれません。ユーザー識別子は個人データであるため、このレポートは `reports:read` を持つキーに限定されます。

## サインインとみなされる条件

成功した認証は、この組織のコンテキストで完了した場合にサインインとみなされます。組織が選択されていない状態でのサインインはカウントされません。有効化の日時（`activated_at`、または一度も有効化されていない場合は作成日時）がしきい値より新しいメンバーシップは一覧に含まれません。そのため、昨日参加したメンバーが 30 日のレポートに表示されることはありません。

## リクエスト

| パラメータ | 指定場所 | 必須 | 説明 |
|---|---|---|---|
| `organization_id` | query | はい | 組織（`org_…`）。 |
| `days` | query | いいえ | 非アクティブと判定する日数（7〜365）。既定値は 30。 |
| `limit` | query | いいえ | ページサイズ（1〜100）。既定値は 50。 |
| `cursor` | query | いいえ | 前のページの `next_cursor`。有効なのは、発行時の環境、`organization_id`、`days` に対してのみです。 |

行は、メンバーシップが最後に更新された順に並びます。しきい値（`inactive_since`）は最初のページで一度だけ計算され、カーソルに保持されるため、1 つのレポートのすべてのページが同じ時点を使用します。

1 ページで走査されるメンバーシップは最大 500 件であり、`limit` より少ない行、場合によっては 0 行しか返されないことがあります。`null` になるまで、`next_cursor` を使って次のページを取得し続けてください。

## レスポンス

`200 OK`。

| フィールド | 説明 |
|---|---|
| `organization_id` | レポートの対象組織。 |
| `days` | 使用されたしきい値。 |
| `inactive_since` | しきい値の時点（リクエスト時刻から `days` を引いた値、RFC 3339、UTC）。その時点以降にサインインがないメンバーが一覧に含まれます。 |
| `data_since` | この環境で記録された最初の認証成功時刻。それより前のサインインは不明です。環境にまだ記録がない場合は `null`。 |
| `complete` | `data_since` が `inactive_since` 以前でない場合は `true`。これにより、一覧がしきい値の期間全体をカバーします。 |
| `data` | 本ページの行（後述）。 |
| `next_cursor` | 次のページ用のカーソル。最後のページでは `null`。 |

`data` の各行には次のフィールドがあります。

| フィールド | 説明 |
|---|---|
| `membership_id` | `mem_…`。 |
| `user_id` | `usr_…`。 |
| `activated_at` | メンバーシップが有効になった日時（一度も有効化されていない場合は作成日時）。 |
| `last_authenticated_at` | この組織での最後の認証成功時刻。`data_since` 以降に記録がない場合は `null`。 |

`complete` が `false` の場合、一覧に含まれるメンバーが `data_since` より前にサインインしている可能性があるため、一覧を最終的な結果とみなさないでください。`data_since` が `null` の場合、この環境ではまだサインインが記録されておらず、対象期間を満たすすべてのメンバーが一覧に含まれます。

```json
{
  "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
}
```

## エラー

すべてのエラーは、安定した `code` を含む `application/problem+json` ボディで返されます。

| HTTP | `code` | 発生条件 |
|---|---|---|
| 400 | `invalid_cursor` | カーソルの形式が不正であるか、別の環境、組織、`days` 向けに発行されています。 |
| 404 | `not_found` | 組織が存在しないか、別の環境に属しています。 |
| 422 | `validation_failed` | `organization_id` が欠落しているか不正である、`days` または `limit` が範囲外である、またはパラメータが重複しています。 |
| 401 | `unauthenticated` | API キーが欠落、無効、または取り消されています。 |
| 403 | `insufficient_permissions` | キーに `reports:read` がありません。 |
| 429 | `rate_limited` | レート制限を超えました。`Retry-After` に従ってください。 |
| 503 | `service_unavailable` | レポートサービスが一時的に利用できません。後で再試行してください。 |

## 例

```bash
curl "https://api.eu.keenauth.com/v1/reports/inactive-members?organization_id=org_01j9xk3m7q8r2s4t6v8w0y2z4d&days=60" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

```bash
keenauth reports inactive-members org_01j9xk3m7q8r2s4t6v8w0y2z4d --days 60
```

## 個人データ

このエンドポイントは個人データを扱います。組織のメンバーシップと招待（ユーザーおよびメンバーシップの識別子とサインイン時刻を含みます）。[KeenAuth API の個人データ](/docs/policies/personal-data)では、保存される内容、保持期間、削除方法について説明しています。どのフィールドにも特別な種類の個人データ（健康、生体情報、宗教、政治的意見、性的指向）を送信しないでください。
