
# 동의 기록 가져오기

`POST /v1/jobs/consent-imports` · 권한 `consent-records:write`

다른 시스템에 기록된 법적 문서 동의 내역을 가져옵니다. 예를 들어 사용자를 KeenAuth로 이전할 때 사용합니다. 요청은 동기식입니다. 1–500개의 기록이 하나의 트랜잭션에서 기록되므로, 전부 기록되거나 하나도 기록되지 않습니다. 가져온 모든 기록에는 `method = import`가 있으며, `occurred_at`는 원본 시스템의 시간을 유지합니다. 버전, 콘텐츠 해시, 로케일은 문서에서 가져오며 직접 지정할 수 없습니다. 가져온 기록은 다른 모든 동의 기록과 마찬가지로 추가 전용입니다. 지금 얻은 단일 동의를 기록하려면 [동의 기록 생성](/docs/api/management/users/create-consent-record)을 사용하십시오.

`Idempotency-Key`가 필요합니다. 같은 키와 요청으로 재시도하면 같은 응답(`Idempotent-Replayed: true` 포함)이 반환되며, 아무것도 다시 기록되지 않습니다.

## 요청

JSON 본문(알 수 없는 필드는 `400 unknown_field`로 거부됩니다):

| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
| `records` | object[] | 예 | 1–500개의 기록, 이 순서대로 기록됩니다. |
| `records[].user_id` | string | 예 | 사용자 ID(`usr_…`). |
| `records[].subject_type` | string | 예 | `document`만 가능합니다. |
| `records[].subject_id` | string | 예 | 법적 문서 ID(`ldoc_…`). |
| `records[].state` | string | 예 | `presented`, `accepted` 또는 `declined`. |
| `records[].application_id` | string \| null | 아니요 | 애플리케이션(`app_…`). 생략되고 문서가 애플리케이션별이면 문서의 애플리케이션이 기록됩니다. |
| `records[].occurred_at` | string (date-time) | 예 | 원본 시스템에서 발생한 시각. 미래일 수 없습니다. |

## 응답

`201 Created`와 함께 기록된 항목(`records`)을 입력 순서대로 반환합니다.

```json
{
  "imported_count": 1,
  "records": [
    {
      "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": "import",
      "application_id": null,
      "occurred_at": "2025-03-14T08:00:00Z"
    }
  ]
}
```

## 오류

| HTTP | 코드 | 발생 시점 |
|---|---|---|
| 400 | `malformed_request`, `unknown_field` | `Idempotency-Key` 헤더가 없거나 형식이 잘못되었거나, 본문이 유효한 JSON이 아니거나, 알 수 없는 필드가 있습니다. |
| 401 | `unauthenticated` | 자격 증명이 없거나, 잘못되었거나, 취소되었습니다. |
| 403 | `insufficient_permissions` | 자격 증명에 필요한 권한이 없습니다. |
| 413 | `payload_too_large` | 본문이 1 MiB보다 큽니다. |
| 415 | `unsupported_media_type` | 콘텐츠 유형이 `application/json`가 아닙니다. |
| 422 | `validation_failed` | 기록이 잘못되었습니다. `errors[].pointer`는 `/records/<index>/<field>`입니다. 알 수 없는 사용자는 `unknown_user`, 알 수 없는 애플리케이션은 `unknown_application`, 알 수 없는 문서는 `unknown_subject`입니다. 기록이 1개 미만이거나 500개를 초과하면 `out_of_range`이며 `/records`에서 발생합니다. 아무것도 기록되지 않습니다. |
| 422 | `idempotency_key_reuse` | `Idempotency-Key`가 다른 요청에 사용되었습니다. |
| 429 | `rate_limited` | 요청 한도를 초과했습니다. `Retry-After` 기간 후에 다시 시도하십시오. |
| 503 | `service_unavailable` | 종속 서비스를 일시적으로 사용할 수 없습니다. `Retry-After` 기간 후에 다시 시도하십시오. |

## 예제

```bash
curl -X POST https://api.eu.keenauth.com/v1/jobs/consent-imports \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"records":[{"user_id":"usr_01j9xk3m7q8r2s4t6v8w0y2z4c","subject_type":"document","subject_id":"ldoc_01j9xk3m7q8r2s4t6v8w0y2z4a","state":"accepted","occurred_at":"2025-03-14T08:00:00Z"}]}'
```

CLI: `keenauth jobs consent-imports create --data records.json`

## 개인 정보

이 엔드포인트는 개인 정보인 동의 기록을 다룹니다. [KeenAuth API의 개인 정보](/docs/policies/personal-data)에서 저장되는 내용, 보관 기간, 삭제 방법을 설명합니다. 어떤 필드에도 민감한 개인 정보(건강, 생체 정보, 종교, 정치적 견해, 성적 지향)를 보내지 마십시오.
