
# 同意を記録する

`POST /v1/users/{user_id}/consent-records` · 権限 `consent-records:write`

お客様の独自チャネルで取得した同意を記録します（`method = management_api`）。対象は法的文書です（`subject_type = document`。同意の目的はまだ利用できません）。`state` には `presented`、`accepted`、`declined` を指定します。バージョン、コンテンツのハッシュ、ロケールは文書から取得されるため、指定できません。`occurred_at` の既定値は現在時刻です。未来の時刻や、5 分より前の時刻は指定できません。同意の記録は追記のみで、更新や削除はされません。

## リクエスト

パスパラメーター:

| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| `user_id` | string | はい | ユーザー ID（`usr_…`）。 |

JSON ボディ（不明なフィールドは `400 unknown_field` で拒否されます）:

| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| `Idempotency-Key` | header | いいえ | 再試行されたリクエストを安全にするための任意のキー（16〜64 文字）。 |
| `subject_type` | string | はい | `document` のみ。 |
| `subject_id` | string | はい | ユーザーが確認した法的文書の ID（`ldoc_…`）。 |
| `state` | string | はい | `presented`、`accepted`、`declined` のいずれか。 |
| `application_id` | string \| null | いいえ | アプリケーション（`app_…`）。省略され、文書がアプリケーション固有の場合は、文書のアプリケーションが記録されます。 |
| `occurred_at` | string (date-time) | いいえ | 同意が行われた日時。既定値は現在時刻で、未来ではなく、5 分より前ではない必要があります。 |

## レスポンス

`201 Created` と同意記録を返します。

```json
{
  "id": "crec_01j9xk3m7q8r2s4t6v8w0y2z4b",
  "user_id": "usr_01j9xk3m7q8r2s4t6v8w0y2z4c",
  "subject_type": "document",
  "subject_id": "ldoc_01j9xk3m7q8r2s4t6v8w0y2z4a",
  "subject_version": "2026-10",
  "content_sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
  "locale": "en",
  "state": "accepted",
  "method": "management_api",
  "application_id": null,
  "occurred_at": "2026-10-05T09:31:12.004211Z"
}
```

## エラー

| HTTP | code | 発生条件 |
|---|---|---|
| 400 | `unknown_field` | ボディに不明なフィールドが含まれています。 |
| 404 | `not_found` | ユーザーまたは `application_id` がこの環境に存在しません。`resource` 拡張により、どちらが見つからないかがわかります（`user` または `application`）。 |
| 415 | `unsupported_media_type` | コンテンツタイプが `application/json` ではありません。 |
| 422 | `validation_failed` | フィールドが無効です。文書が不明（`/subject_id`、`unknown_subject`）、`subject_type: purpose`（`not_supported`）、文書では許可されない state、または `occurred_at` が範囲外です。 |
| 401 | `unauthenticated` | 認証情報がないか、無効または取り消されています。 |
| 403 | `insufficient_permissions` | 認証情報に必要な権限がありません。 |
| 429 | `rate_limited` | レート制限を超えました。`Retry-After` の期間が経過してから再試行してください。 |
| 503 | `service_unavailable` | 依存先が一時的に利用できません。`Retry-After` の期間が経過してから再試行してください。 |

## 例

```bash
curl -X POST https://api.eu.keenauth.com/v1/users/usr_01j9xk3m7q8r2s4t6v8w0y2z4c/consent-records \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"subject_type":"document","subject_id":"ldoc_01j9xk3m7q8r2s4t6v8w0y2z4a","state":"accepted"}'
```

## 個人データ

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