> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lexq.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 오류 코드

> LexQ 플랫폼(통합 API·콘솔)의 전체 오류 코드 참조. 코드는 버전 간 안정적이며, HTTP 상태와 메시지 문구는 변경될 수 있습니다.

## 오류 응답 형식

모든 오류는 동일한 envelope을 따릅니다:

```json theme={null}
{
  "result": "ERROR",
  "code": "P-001",
  "message": "정책 그룹을 찾을 수 없습니다."
}
```

`code` 필드는 안정적인 식별자입니다. 통합 코드는 `code` 값을 기준으로 분기하세요. `message`는 사람이 읽기 위한 텍스트로 `Accept-Language` 헤더(`en` 또는 `ko`)에 따라 지역화되며 시간이 지나면서 표현이 바뀔 수 있지만, `code`는 바뀌지 않습니다.

<Info>
  이 문서는 통합 API와 콘솔(계정, 결제, 멤버 관리)을 포함해 플랫폼이 반환할 수 있는 모든 코드를 열거합니다. 통합 클라이언트가 실제로 만나지 않는 섹션도 있습니다. 멤버 & 계정(M)이나 Auth의 로그인 관련 항목이 그렇습니다. 그래도 함께 문서화하는 이유는 하나입니다. 어떤 표면에서 어떤 코드를 만나든 의미가 정확히 하나로 풀려야 하기 때문입니다.
</Info>

<Info>
  코드 번호는 안정적인 식별자입니다. 한 번 할당된 코드는 의미가 바뀌어도 재사용되지 않습니다. 번호 갭(예: `ACT-007`, `ACT-008`, `ACT-010`, `ACT-011`, `ACT-012`의 부재)은 엔진의 도메인 중립 원시(primitive) 리팩토링 영역에서 폐기된 코드를 반영합니다.
</Info>

## 공통 (C)

| 코드      | HTTP | 설명                 |
| ------- | :--: | ------------------ |
| `C-001` |  400 | 입력값이 올바르지 않습니다     |
| `C-002` |  405 | 허용되지 않은 HTTP 메서드   |
| `C-003` |  404 | 요청한 리소스를 찾을 수 없습니다 |
| `C-004` |  500 | 서버 내부 오류           |
| `C-005` |  400 | 데이터 타입이 올바르지 않습니다  |
| `C-006` |  409 | 이미 존재하는 리소스        |
| `C-007` |  429 | 요청량 초과 (TPS 한도)    |
| `C-008` |  400 | 올바르지 않은 시간대        |
| `C-009` |  400 | 허용되지 않은 상태 전환      |

## 인증 (A)

| 코드      | HTTP | 설명                      |
| ------- | :--: | ----------------------- |
| `A-001` |  401 | 인증 실패                   |
| `A-002` |  403 | 접근 권한 없음                |
| `A-003` |  401 | 유효하지 않은 API 키           |
| `A-004` |  409 | 이미 가입된 이메일              |
| `A-005` |  409 | API 키 최대 개수 초과          |
| `A-006` |  401 | 이메일 또는 비밀번호 오류          |
| `A-007` |  409 | 이미 사용 중인 전화번호           |
| `A-008` |  401 | Google 계정으로 로그인 필요      |
| `A-009` |  401 | Google 계정 이메일 미인증       |
| `A-010` |  401 | Google 인증 실패            |
| `A-011` |  400 | Google 계정은 비밀번호 재설정 불가  |
| `A-012` |  400 | Google 계정은 비밀번호 변경 불가   |
| `A-013` |  400 | 새 비밀번호는 현재 비밀번호와 달라야 함  |
| `A-014` |  400 | 비밀번호 재설정 링크 만료 또는 무효    |
| `A-015` |  503 | 인증 메일 발송 실패             |
| `A-016` |  401 | 세션 만료                   |
| `A-017` |  401 | 유효하지 않은 세션              |
| `A-018` |  403 | 시스템 계정 필요               |
| `A-019` |  403 | System Manager 계정 변경 불가 |
| `A-020` |  401 | 비밀번호가 올바르지 않습니다         |

## 정책 엔진 (P)

| 코드      | HTTP | 설명                                        |
| ------- | :--: | ----------------------------------------- |
| `P-001` |  404 | 정책 그룹을 찾을 수 없습니다                          |
| `P-002` |  404 | 정책 버전을 찾을 수 없습니다                          |
| `P-003` |  500 | 정책 실행 중 오류 발생                             |
| `P-004` |  400 | 승인되지 않은 정책 버전                             |
| `P-005` |  404 | 정책 규칙을 찾을 수 없습니다                          |
| `P-006` |  400 | 현재 상태에서 수정 불가 (DRAFT만 수정 가능)              |
| `P-007` |  400 | 규칙 없이 발행 불가                               |
| `P-008` |  400 | 현재 상태에서 수행할 수 없는 작업                       |
| `P-009` |  403 | 정책 그룹이 비활성화(DISABLED) 상태                  |
| `P-010` |  400 | 규칙 순서 변경 ID 불일치                           |
| `P-011` |  400 | Activation 그룹 내 Mode/Strategy 불일치         |
| `P-012` |  400 | Mutex 그룹 내 Mode/Strategy 불일치              |
| `P-013` |  400 | 롤백할 이전 버전이 없음                             |
| `P-014` |  404 | 배포 이력을 찾을 수 없습니다                          |
| `P-015` |  400 | 실행 요청에 필수 fact 누락                         |
| `P-016` |  400 | 버전이 대상 정책 그룹에 속하지 않음                      |
| `P-017` |  409 | 버전이 배포 중이거나 A/B 테스트 사용 중                  |
| `P-018` |  400 | 유효 기간이 올바르지 않음 (시작일이 종료일보다 이후)            |
| `P-019` |  400 | 그룹에 배포된 버전이 없음                            |
| `P-020` |  409 | 운영 중인 배포가 있어 그룹 삭제 불가                     |
| `P-021` |  409 | A/B 테스트 실행 중이라 그룹 삭제 불가                   |
| `P-022` |  400 | SINGLE 조건의 필드는 필수                         |
| `P-023` |  400 | SINGLE 조건의 연산자는 필수                        |
| `P-024` |  400 | 조건 트리 깊이가 최대값 초과                          |
| `P-025` |  400 | 정책 버전 내 규칙 priority 중복                    |
| `P-026` |  400 | activationGroup cluster 내 그룹 priority 중복  |
| `P-027` |  400 | 조건 연산자와 값 형식 불일치                          |
| `P-028` |  400 | 조건 valueType 필수 (자동 추론 금지)                |
| `P-029` |  400 | 조건 value 필수 (null 비교 미지원)                 |
| `P-030` |  404 | 도메인 템플릿을 찾을 수 없음                          |
| `P-031` |  400 | 도메인 템플릿 아직 사용 불가                          |
| `P-032` |  409 | 정책 그룹명 이미 사용 중                            |
| `P-033` |  409 | 정책 그룹명 자동 생성 실패                           |
| `P-034` |  400 | 그룹 재정렬 ID 불일치 (부재 또는 보관 상태)               |
| `P-035` |  400 | 프로파일 조회 기간 무효 (시작 시각이 종료 시각보다 앞서야 함)      |
| `P-036` |  400 | 이미 운영 중인 버전 (배포할 변경 없음)                   |
| `P-037` |  400 | 버전의 유효 시작일이 아직 도래하지 않았습니다. 예약 배포를 사용하세요   |
| `P-038` |  409 | 이 그룹에는 이미 대기 중인 예약 배포가 있습니다               |
| `P-039` |  404 | 취소할 대기 중인 예약 배포가 없습니다                     |
| `P-040` |  400 | 예약할 수 없는 버전입니다. 유효 시작일이 미래인 발행됨 상태여야 합니다  |
| `P-041` |  400 | 예약 시각이 이미 지났습니다. 즉시 배포를 사용하세요             |
| `P-042` |  400 | A/B 테스트 대상 버전이 현재 서빙 가능한 상태가 아닙니다         |
| `P-043` |  409 | 대기 중인 예약 배포가 이 버전을 참조합니다. 예약을 취소한 후 삭제하세요 |

## 멱등성 (I)

| 코드      | HTTP | 설명                 |
| ------- | :--: | ------------------ |
| `I-001` |  409 | 이미 처리된 요청 (중복 멱등키) |
| `I-002` |  409 | 현재 처리 중인 요청        |

## 시스템 / 암호화 (S)

| 코드      | HTTP | 설명         |
| ------- | :--: | ---------- |
| `S-001` |  500 | 데이터 암호화 실패 |
| `S-002` |  500 | 데이터 복호화 실패 |

## 결제 (B)

| 코드      | HTTP | 설명                             |
| ------- | :--: | ------------------------------ |
| `B-001` |  404 | 요금제를 찾을 수 없습니다                 |
| `B-002` |  404 | 구독 정보를 찾을 수 없습니다               |
| `B-003` |  409 | 이미 사용 중인 구독 존재                 |
| `B-004` |  400 | 현재 상태에서 수행할 수 없는 작업            |
| `B-005` |  404 | 청구서를 찾을 수 없습니다                 |
| `B-006` |  500 | 해당 통화를 지원하는 결제 프로세서 없음         |
| `B-007` |  502 | 결제 처리 실패                       |
| `B-008` |  403 | 서비스 사용 한도 초과                   |
| `B-009` |  400 | 무료 플랜은 해지 불가                   |
| `B-010` |  400 | 유료 플랜 구독 전 결제 수단 등록 필요         |
| `B-011` |  400 | 유료 플랜 구독 전 사업자 정보 등록 필요        |
| `B-012` |  400 | 이미 결제 완료된 청구서                  |
| `B-013` |  400 | 이미 해당 플랜 구독 중                  |
| `B-014` |  400 | 통화 간 플랜 변경 미지원                 |
| `B-015` |  400 | 무료 플랜으로 직접 다운그레이드 불가, 먼저 해지 필요 |
| `B-016` |  409 | 사용 중인 플랜 삭제 불가                 |
| `B-017` |  400 | 유료 플랜 구독 중 통화 변경 불가            |
| `B-018` |  400 | 취소할 예약된 다운그레이드 없음              |
| `B-019` |  409 | 동일 등급/통화의 공개 플랜이 이미 존재         |
| `B-020` |  400 | 지원하지 않는 통화 코드                  |
| `B-021` |  400 | 결제 설정 참조가 유효하지 않거나 만료됨         |
| `B-022` |  400 | 웹훅 서명 검증 실패                    |

## 멤버 & 계정 (M)

| 코드      | HTTP | 설명                      |
| ------- | :--: | ----------------------- |
| `M-001` |  404 | 사용자 정보를 찾을 수 없습니다       |
| `M-002` |  403 | 이메일 인증 필요               |
| `M-003` |  403 | 정지된 계정                  |
| `M-004` |  403 | 탈퇴한 계정                  |
| `M-005` |  400 | 유효하지 않거나 만료된 인증 코드      |
| `M-006` |  400 | 이미 활성화된 계정              |
| `M-007` |  400 | 만료된 초대                  |
| `M-008` |  400 | 유효하지 않은 초대 토큰           |
| `M-009` |  400 | 본인에게 수행 불가한 작업          |
| `M-010` |  400 | 마지막 관리자 삭제/강등 불가        |
| `M-011` |  409 | 이미 사용 중인 전화번호           |
| `M-012` |  403 | 정지된 계정 (사유 포함)          |
| `M-013` |  400 | 초대로는 관리자 역할 부여 불가       |
| `M-014` |  409 | 이전 구독 정산 진행 중, 잠시 후 재시도 |

## 분석 & 시뮬레이션 (AN)

| 코드       | HTTP | 설명                              |
| -------- | :--: | ------------------------------- |
| `AN-001` |  500 | 시뮬레이션 처리 실패                     |
| `AN-002` |  404 | 데이터셋을 찾을 수 없습니다                 |
| `AN-003` |  400 | 데이터셋이 너무 큽니다                    |
| `AN-004` |  400 | 데이터셋에 레코드 없음                    |
| `AN-005` |  400 | 데이터셋 형식 오류                      |
| `AN-006` |  400 | 지원하지 않는 데이터 소스                  |
| `AN-007` |  500 | 데이터셋 스토리지 오류                    |
| `AN-008` |  400 | 비교 대상 버전(Baseline)이 올바르지 않음     |
| `AN-009` |  404 | 시뮬레이션을 찾을 수 없습니다                |
| `AN-010` |  400 | PENDING 또는 RUNNING 시뮬레이션만 취소 가능 |
| `AN-011` |  400 | 완료된 시뮬레이션만 내보내기 가능              |
| `AN-012` |  500 | 시뮬레이션 내보내기 실패                   |
| `AN-013` |  404 | 업로드된 데이터셋 파일을 찾을 수 없습니다         |
| `AN-014` |  400 | 데이터셋 파일 파싱 실패                   |
| `AN-015` |  500 | 시뮬레이션 결과 데이터 형식 오류              |
| `AN-016` |  400 | 데이터셋 내 필수 fact 누락               |
| `AN-017` |  400 | 데이터셋 내 fact 타입 불일치              |
| `AN-018` |  400 | HISTORICAL 데이터셋에 기간(from/to) 필수 |
| `AN-019` |  400 | UPLOADED 데이터셋에 파일 경로 필수         |
| `AN-020` |  400 | 빈 파일 업로드 불가                     |
| `AN-021` |  400 | 데이터셋 파일 크기 초과                   |
| `AN-022` |  400 | 지원하지 않는 데이터셋 파일 형식              |
| `AN-023` |  400 | 지원하지 않는 내보내기 형식                 |
| `AN-024` |  404 | 재실행 대상 실행을 찾을 수 없습니다            |
| `AN-025` |  404 | 재실행 작업을 찾을 수 없습니다               |
| `AN-026` |  404 | 결정 트레이스를 찾을 수 없습니다              |
| `AN-027` |  400 | PII로 지정되지 않은 fact               |
| `AN-028` |  409 | 감사 이력이 있는 버전은 삭제할 수 없습니다        |
| `AN-029` |  500 | 감사 봉인 실패, 작업 거부                 |

## 액션 & 계산 (ACT)

| 코드        | HTTP | 설명                                                   |
| --------- | :--: | ---------------------------------------------------- |
| `ACT-001` |  400 | 액션 파라미터가 비어있습니다                                      |
| `ACT-002` |  400 | 참조 변수 `refVar` 필수                                    |
| `ACT-003` |  400 | 잘못된 계산 방식 (허용: PERCENTAGE, AMOUNT)                   |
| `ACT-004` |  400 | PERCENTAGE 방식에 rate 파라미터 필수                          |
| `ACT-005` |  400 | AMOUNT 방식에 value 파라미터 필수                             |
| `ACT-006` |  400 | 잘못된 액션 타입                                            |
| `ACT-009` |  400 | 외부 서비스 액션에 Integration ID 필수                         |
| `ACT-013` |  400 | 웹훅 URL 또는 연동 설정 필수                                   |
| `ACT-014` |  400 | SET\_FACT 액션에 fact 키 필수                              |
| `ACT-015` |  400 | ADD\_TAG 액션에 태그 필수                                   |
| `ACT-016` |  400 | INCREMENT\_FACT 액션에 `targetVar` 필수                   |
| `ACT-017` |  400 | rounding 옵션은 객체여야 함                                  |
| `ACT-018` |  400 | rounding scale은 정수여야 함                               |
| `ACT-019` |  400 | rounding scale 범위 초과 `[0, 16]`                       |
| `ACT-020` |  400 | 잘못된 rounding mode                                    |
| `ACT-021` |  400 | MUTATE\_FACT 액션에 operator 필수                         |
| `ACT-022` |  400 | 잘못된 operator                                         |
| `ACT-023` |  400 | 잘못된 operator-method 조합 (예: DIV + PERCENTAGE)         |
| `ACT-024` |  400 | 0으로 나누기 불가                                           |
| `ACT-025` |  400 | `refVar`가 입력 facts에 없음                               |
| `ACT-026` |  400 | `targetVar`가 입력 facts에 없음                            |
| `ACT-027` |  400 | EMIT\_EVENT는 비어있지 않은 `eventPayload` 필수               |
| `ACT-028` |  400 | EMIT\_NOTIFICATION은 비어있지 않은 `notificationPayload` 필수 |

<Info>
  `ACT-007`, `ACT-008`, `ACT-010`, `ACT-011`, `ACT-012` 코드는 엔진이 도메인 중립 원시(primitive) 영역으로 전환되면서 폐기되었습니다. 해당 번호는 재사용되지 않습니다.
</Info>

## Fact 정의 (FD)

| 코드       | HTTP | 설명                |
| -------- | :--: | ----------------- |
| `FD-001` |  409 | fact 키 중복         |
| `FD-002` |  404 | fact 없음           |
| `FD-003` |  403 | 시스템 fact 수정/삭제 불가 |
| `FD-004` |  400 | fact 키 형식 무효      |
| `FD-005` |  400 | 시스템 예약 fact 키     |

## 연동 (INT)

| 코드        | HTTP | 설명                    |
| --------- | :--: | --------------------- |
| `INT-001` |  404 | 연동을 찾을 수 없습니다         |
| `INT-002` |  409 | 연동 이름 중복              |
| `INT-003` |  400 | 잘못된 연동 설정             |
| `INT-004` |  400 | 연동 타입은 변경 불가          |
| `INT-005` |  400 | 연동 설정에 필수 항목 누락       |
| `INT-006` |  400 | 연동에 사용할 수 없는 HTTP 메서드 |
| `INT-007` |  400 | 연동 설정의 필수 항목 누락       |

## 장애 로그 (FL)

| 코드       | HTTP | 설명                      |
| -------- | :--: | ----------------------- |
| `FL-001` |  404 | 장애 로그를 찾을 수 없습니다        |
| `FL-002` |  400 | 현재 상태의 장애 로그에 수행 불가한 작업 |
| `FL-003` |  400 | 해당 유형은 재시도를 지원하지 않음     |

## 웹훅 구독 (WH)

| 코드       | HTTP | 설명                              |
| -------- | :--: | ------------------------------- |
| `WH-001` |  404 | 웹훅 구독을 찾을 수 없습니다                |
| `WH-002` |  409 | 웹훅 구독 이름 중복                     |
| `WH-003` |  502 | 웹훅 테스트 발송 실패                    |
| `WH-004` |  400 | 유효하지 않은 웹훅 URL (http/https만 허용) |
| `WH-005` |  400 | 웹훅 URL 차단 (사설/내부 주소로 해석됨)       |
