사용자 생성

POST /v1/users · 권한 users:write

API 키의 환경에 사용자를 생성합니다. 사용자는 해당 환경에만 속하며, 두 환경에 같은 이메일 주소가 있으면 서로 다른 두 사용자로 취급됩니다. 고유 값(email, phone_number, username, external_id)은 환경별로 확인합니다. 재시도를 안전하게 처리하려면 Idempotency-Key 헤더를 보내십시오.

요청

본문은 JSON 객체입니다. 스키마에 없는 필드가 있으면 unknown_field 오류와 함께 거부됩니다.

필드 타입 필수 여부 설명
email string 아니요* 기본 이메일 주소입니다.
email_verified boolean 아니요 이메일 주소를 인증됨으로 표시합니다. 기본값은 false입니다.
phone_number string 아니요* E.164 형식의 기본 전화번호입니다.
phone_verified boolean 아니요 전화번호를 인증됨으로 표시합니다. 기본값은 false입니다.
phone_country_code string 아니요 ISO 3166-1 alpha-2 코드입니다. 비어 있으면 전화번호 접두사에서 도출합니다.
username string 아니요* 3~64자입니다. 환경 내에서 고유해야 합니다.
external_id string 아니요 고객사가 관리하는 식별자이며, 1~255자입니다. 환경 내에서 고유해야 합니다.
name, given_name, family_name, middle_name, nickname string 아니요 프로필 이름입니다.
picture, website, profile_url string 아니요 https:// URL이며, 최대 2048자입니다.
locale, zoneinfo, gender, birthdate string 아니요 프로필 속성입니다. birthdate는 YYYY-MM-DD 형식입니다.
address object 아니요 OIDC address 객체이며, 최대 2048바이트입니다.
user_metadata, app_metadata object 아니요 자유 형식 JSON 객체이며, 최대 16 KiB, 깊이 5, 최상위 키 100개까지 허용됩니다.

* email, phone_number, username 중 하나 이상이 필요합니다.

응답

201 Created를 반환합니다. 본문은 사용자 객체입니다. ETag 헤더에는 사용자 버전이 담깁니다.

API 키에 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,
  "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이 아니거나 스키마에 없는 필드가 있습니다.
409 conflict 값이 이미 사용 중입니다. errors[]에 필드와 사유(email_taken, phone_taken, username_taken, external_id_taken)가 표시됩니다.
415 unsupported_media_type Content-Type이 application/json이 아닙니다.
422 validation_failed 값이 유효하지 않습니다. errors[].pointer에 해당 필드가 표시됩니다.
401 unauthenticated API 키가 없거나 유효하지 않거나 폐기되었습니다.
403 insufficient_permissions API 키에 users:write 권한이 없습니다.
429 rate_limited 요청 한도를 초과했습니다. Retry-After를 따르십시오.
503 service_unavailable 종속 서비스를 일시적으로 사용할 수 없습니다. 나중에 다시 시도하십시오.

예시

curl -X POST https://api.eu.keenauth.com/v1/users \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"email": "ada@example.com", "email_verified": true, "name": "Ada Lovelace"}'

개인정보

이 엔드포인트는 개인정보, 즉 최종 사용자 프로필을 다룹니다. KeenAuth API의 개인정보에서 저장되는 항목, 보관 기간, 삭제 방법을 확인하십시오. 어떤 필드에도 민감정보(건강, 생체 정보, 종교, 정치적 견해, 성적 지향)를 보내지 마십시오.