
# 組織に人を招待する

`POST /v1/invitations` · 権限 `invitations:write`

メールアドレスに対して、組織に参加するための招待を作成します。`organization_id` を指定しない場合、招待は環境招待になります。これは招待制サインインモードのサインアップリンクであり、メンバーシップは作成されず、ロールを含めることもできません（`role_ids` は `422 validation_failed` を返します）。レスポンスには `organization_id: null` が含まれます。`delivery` は必須です。`email` を指定すると、環境の招待テンプレート（`delivery_status: queued`）を使って招待メールが送信されます。リンクはメールにのみ含まれ、レスポンスに `accept_url` は含まれません。`link_only` を指定するとメールは送信されず、共有用のリンクが返されます。承諾リンク（`accept_url`）はこのレスポンスでのみ一度返され、以降どのエンドポイントも返しません。レスポンスには `Cache-Control: no-store` が含まれます。同じ `Idempotency-Key` に対してリプレイされたレスポンスではリンクが省略され、`secret_redacted: true` が含まれます。招待メールがデプロイで設定されていない場合（非本番環境の設定のみ）、`email` の配信は `501 not_implemented` を返し、何も書き込まれません。同じロールを持つ未承諾の招待が、組織とメールアドレスについてすでに存在する場合は、新しいリンクで再送され、レスポンスは `200` になります。期限切れだがまだ処理されていない未承諾の招待は、同じリクエスト内で `expired` とマークされ、新しい招待が書き込まれます（`invitation.expired` として監査されます）。同じロールを持つ未承諾の `email` 招待は、メールで再送されます。レスポンスは `200` で、`delivery: email` を含み、`accept_url` は含みません。書き込みは `invitation.created` として監査されます。

## リクエスト

| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| `organization_id` | string | いいえ | 組織 ID（`org_…`）。環境招待（ロールなし）にする場合は省略してください。 |
| `email` | string | はい | 招待される人のメールアドレス。320 文字まで。 |
| `delivery` | string | はい | `email`（リンクはメールにのみ含まれます）または `link_only`（リンクはこのレスポンスにのみ含まれます）。 |
| `role_ids` | string[] | いいえ | 承諾時に付与されるロール（`rol_…`）。最大 10 件。空の場合はデフォルトのメンバーロール。 |
| `application_id` | string | いいえ | 招待された人が着地するアプリケーション（`app_…`）。この環境に存在している必要があります。 |
| `ttl_days` | integer | いいえ | 1〜30。デフォルトは環境の `invitation_ttl_days`（7）。 |

## レスポンス

`201 Created` を、招待と承諾リンク（未承諾の招待を再送した場合は `200 OK`）とともに返します。

```json
{
  "id": "inv_01j9xt9v3w4y8z0a2b4c6d8e0g",
  "organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4a",
  "email": "ada@example.com",
  "role_ids": [
    "rol_01j9xr7s1t2w6x8y0z2a4b6c8e"
  ],
  "application_id": null,
  "delivery": "link_only",
  "delivery_status": "not_sent",
  "status": "pending",
  "send_count": 1,
  "last_sent_at": "2026-10-12T09:31:00.123456Z",
  "expires_at": "2026-10-19T09:31:00.123456Z",
  "accepted_user_id": null,
  "accepted_at": null,
  "revoked_at": null,
  "created_at": "2026-10-12T09:31:00.123456Z",
  "updated_at": "2026-10-12T09:31:00.123456Z",
  "version": 1,
  "accept_url": "https://acme.eu.keenauth.app/u/login?invitation=<token>"
}
```

## エラー

| HTTP | code | 発生条件 |
|---|---|---|
| 404 | `not_found` | 組織またはアプリケーションがこの環境に存在しない。 |
| 409 | `invitation_already_pending` | このメールアドレスに、異なるロールを持つ未承諾の招待が存在する。 |
| 409 | `membership_already_exists` | このメールアドレスはすでにメンバーに属している。 |
| 409 | `organization_disabled` | 組織が無効になっている。 |
| 422 | `invitation_invalid` | これらの値では招待を作成できない。 |
| 422 | `validation_failed` | フィールドが不足しているか、無効である。 |
| 429 | `invite_rate_limited` | 招待が、10 分以内に再送されたか、すでに 5 回再送されている。 |
| 501 | `not_implemented` | `delivery` が `email` で、デプロイに招待メールが設定されていない。 |
| 401 | `unauthenticated` | 認証情報がない、無効、または取り消されている。 |
| 403 | `insufficient_permissions` | 認証情報に必要な権限がない。特権（`is_privileged`）ロールの割り当てには `roles:write` も必要です。これがない場合は何も書き込まれず、`required_permissions` には両方の権限が一覧されます。 |
| 429 | `rate_limited` | レート制限を超えた。`Retry-After` の期間の後に再試行してください。 |
| 503 | `service_unavailable` | 依存先が一時的に利用できない。`Retry-After` の期間の後に再試行してください。 |

## 例

```bash
curl -i -X POST "https://api.eu.keenauth.com/v1/invitations" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{"organization_id":"org_01j9xk3m7q8r2s4t6v8w0y2z4a","email":"ada@example.com","delivery":"link_only","role_ids":["rol_01j9xr7s1t2w6x8y0z2a4b6c8e"]}'
```

## 個人データ

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