사용자 업데이트
PATCH /v1/users/{user_id} · 권한 users:write
JSON 병합 패치(Content-Type: application/merge-patch+json)로 사용자를 업데이트합니다. 전송한 필드만 변경됩니다. 텍스트 필드는 null 또는 빈 문자열로 지울 수 있으며, email_verified와 phone_verified는 지울 수 없습니다. address는 전체가 교체됩니다. user_metadata와 app_metadata는 키 단위로 병합되며, 값이 null인 키는 삭제됩니다. user_metadata 또는 app_metadata 자체를 null로 보내면 전체가 삭제되고 {}가 남습니다. 상태는 여기서 변경할 수 없으니 차단 및 차단 해제를 사용하십시오. 삭제 대기 중인 사용자는 업데이트할 수 없습니다. If-Match는 선택 사항이며, 전송하는 경우 사용자의 현재 ETag와 일치해야 합니다.
요청
| 매개변수 | 위치 | 필수 여부 | 설명 |
|---|---|---|---|
user_id |
path | 예 | 사용자 ID, 접두사 usr_. |
If-Match |
header | 아니요 | 이전 읽기에서 받은 ETag. |
본문은 사용자 생성과 같은 필드를 모두 선택 사항으로 받으며, 아래의 연령 필드를 추가로 받습니다. 알 수 없는 필드는 unknown_field로 거부됩니다.
연령 및 보호자 동의
자체 연령 확인 또는 보호자 동의 절차가 끝나면 그 결과를 아래 필드로 사용자에게 기록하십시오. 이 필드는 모든 사용자 객체에도 반환되며, null은 사용자가 아직 평가되지 않았음을 뜻합니다.
| 필드 | 값 | 참고 |
|---|---|---|
age_group |
adult, minor, unknown |
지울 수 없습니다. 연령을 알 수 없으면 unknown을 보내십시오. |
parental_consent_status |
not_required, pending, granted, denied, revoked |
null이면 지워집니다. not_required 이외의 값은 사용자의 age_group이 minor인 경우에만 허용됩니다. |
age_assurance_level |
self_declared, birthdate_declared, third_party_verified |
null이면 지워집니다. 절차가 연령을 어느 정도 강도로 확인했는지를 나타냅니다. |
age_group 또는 parental_consent_status가 변경되면 user.updated 이벤트가 발생합니다. 이 필드나 메타데이터에 생년월일이나 신분증 번호를 넣지 마십시오. 결과만 전송하십시오.
응답
200 OK. 본문은 사용자 객체입니다. ETag 헤더에는 사용자 버전이 담겨 있습니다.
키에 users:read_pii 권한이 없으면 개인정보가 마스킹됩니다. email은 a***@e***.com이 되고, phone_number는 마지막 2자리만 남습니다(+**********67). name, given_name, family_name, middle_name, nickname은 이니셜(A. L.)이 되며, username은 첫 글자만 남습니다(a***). birthdate는 ****-**-**이 되고, address는 {"redacted": true}가 됩니다. user_metadata와 app_metadata는 마스킹되지 않습니다.
{
"id": "usr_0a1b2c3d4e5f6g7h8j9k0m1n2p",
"kind": "regular",
"status": "active",
"external_id": null,
"username": null,
"name": "Ada Lovelace",
"email": "ada@example.com",
"email_verified": true,
"phone_number": null,
"phone_verified": false,
"age_group": "adult",
"parental_consent_status": null,
"age_assurance_level": "self_declared",
"user_metadata": {},
"app_metadata": {},
"created_via": "admin_api",
"created_at": "2026-01-15T09:30:00Z",
"updated_at": "2026-01-15T09:30:00Z",
"last_sign_in_at": null,
"deletion_requested_at": null,
"deletion_due_at": null
}
오류
모든 오류는 안정적인 code를 담은 application/problem+json 본문으로 반환됩니다.
| HTTP | code |
발생 조건 |
|---|---|---|
| 400 | malformed_request, unknown_field |
패치가 JSON 객체가 아니거나, 필드가 스키마에 없거나, If-Match가 잘못된 형식인 경우. |
| 409 | conflict |
값이 이미 사용 중이거나, 사용자가 삭제 대기 중인 경우(errors[].code는 user_pending_deletion). |
| 412 | precondition_failed |
If-Match가 현재 버전과 일치하지 않는 경우. |
| 415 | unsupported_media_type |
Content-Type이 application/merge-patch+json이 아닌 경우. |
| 422 | validation_failed |
값이 잘못되었거나 타입이 맞지 않는 경우. errors[].pointer가 해당 필드를 가리킵니다. |
| 404 | not_found |
이 환경에 사용자가 없거나 ID 형식이 잘못된 경우. |
| 401 | unauthenticated |
API 키가 없거나, 잘못되었거나, 취소된 경우. |
| 403 | insufficient_permissions |
키에 users:write 권한이 없는 경우. |
| 429 | rate_limited |
요청 한도를 초과한 경우. Retry-After를 준수하십시오. |
| 503 | service_unavailable |
종속 서비스를 일시적으로 사용할 수 없는 경우. 나중에 다시 시도하십시오. |
예시
curl -X PATCH https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
-H "Content-Type: application/merge-patch+json" \
-d '{"name": "Ada King", "app_metadata": {"tier": "gold"}}'
미성년자의 승인된 보호자 동의를 기록합니다:
curl -X PATCH https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
-H "Content-Type: application/merge-patch+json" \
-d '{"age_group": "minor", "parental_consent_status": "granted", "age_assurance_level": "third_party_verified"}'
개인정보
이 엔드포인트는 개인정보, 즉 최종 사용자 프로필을 포함합니다. KeenAuth API의 개인정보에서 저장되는 항목, 보관 기간, 삭제 방법을 설명합니다. 어떤 필드에도 특수 범주의 개인정보(건강, 생체 정보, 종교, 정치적 견해, 성적 지향)를 보내지 마십시오.