Files
llm-wiki/raw/company-tech-blogs/toss-payments-error-format.md
T

10 KiB

title, source_type, url, archive_url, status, confidence, tags, related_projects, related_branches, created, last_reviewed
title source_type url archive_url status confidence tags related_projects related_branches created last_reviewed
토스페이먼츠 API Error Format company-tech-blog https://docs.tosspayments.com/reference/error-codes raw high
ca-error-envelope
toss
korean-api
custom-envelope
rest-api
korean-fintech
ca-skeleton-operational-contract
feature-operational-error-observability-foundation
feature-boundary-validation-mapping-contract
feature-business-rule-validation-contract
2026-05-22 2026-05-27

토스페이먼츠 API Error Format

Layer: raw/company-tech-blogs/ — 토스페이먼츠 개발자센터 공식 API reference (docs.tosspayments.com). source_typecompany-tech-blog 디렉토리이나 strength 는 official-vendor-doc. 자동 mv 금지 규칙으로 디렉토리 유지 — 후속 정리 권고. 검증된 요약은 /ingestwiki/concepts/에 별도 작성.

Parent / 활용 branch (필수)

Branch 이 자료가 정당화하는 결정
raw/branch-notes/feature-operational-error-observability-foundation error envelope 의 한국 vendor 사례. ca-tmpl 의 두꺼운 envelope vs 토스의 얇은 {code, message} 비교 base
raw/branch-notes/feature-boundary-validation-mapping-contract INVALID_REQUIRED_PARAM 등 validation 코드 명명 컨벤션의 한국 결제 vendor 사례
raw/branch-notes/feature-business-rule-validation-contract business rule 위반 코드 (ALREADY_PROCESSED_PAYMENT, NOT_CANCELABLE_PAYMENT) 의 도메인-specific 어휘 사례
raw/project-notes/ca-skeleton-operational-contract §3. Structured API Response Contract + §6. Operational Error Category 의 한국 reference

컨텍스트

한국 결제/금융 도메인의 대표 사례. ca-tmpl 의 한국어 메시지·운영 컨벤션과 비교 가능. Stripe / GitHub 대비 더 얇은 envelope 이 한국 사용자/개발자에게 어떻게 자리 잡았는지 관찰.

출처 / Source

핵심 인용 / Key quotes (verbatim)

[§에러 객체 구조] "code: 에러 타입을 보여주는 에러 코드입니다."

[§에러 객체 구조] "message: 에러 메시지입니다."

[§응답 조건] "요청이 정상적으로 처리되지 않으면 응답으로 HTTP 상태 코드와 함께 아래와 같은 에러 객체가 돌아옵니다."

[§대표 에러 코드 — UNAUTHORIZED_KEY] "인증되지 않은 시크릿 키 혹은 클라이언트 키"

[§대표 에러 코드 — INVALID_REQUEST] "잘못된 요청입니다"

[§대표 에러 코드 — INVALID_REQUIRED_PARAM] "필수 파라미터가 누락되었습니다"

[§대표 에러 코드 — ALREADY_PROCESSED_PAYMENT] "이미 처리된 결제 입니다"

[§대표 에러 코드 — REJECT_CARD_PAYMENT] "한도초과 혹은 잔액부족으로 결제에 실패"

[§대표 에러 코드 — NOT_CANCELABLE_PAYMENT] "취소 할 수 없는 결제 입니다"

[§대표 에러 코드 — FAILED_INTERNAL_SYSTEM_PROCESSING] "내부 시스템 처리 작업이 실패"

[§대표 에러 코드 — PROVIDER_ERROR] "일시적인 오류가 발생했습니다"

Claims Extracted / 추출된 주장

Claim ID Claim (이 자료가 직접 말하는 것) Evidence quote Strength Applies to Does not prove
TOSS-ERR-C1 에러 객체는 정확히 {code, message} 2개 필드로 구성 — code 는 에러 타입, message 는 에러 메시지 [§에러 객체 구조] "code: 에러 타입을 보여주는 에러 코드입니다." + "message: 에러 메시지입니다." official-vendor-doc 토스페이먼츠 API 의 모든 error 응답 다른 필드 (details, category, retryable, traceId 등) 가 절대 없다는 뜻은 아님 — 본 페이지의 명시 범위에서 없음. traceId 는 별도 헤더로 제공될 가능성 (본 페이지에 명시 없음)
TOSS-ERR-C2 요청 실패 시 HTTP status code 와 함께 error 객체가 반환됨 [§응답 조건] "요청이 정상적으로 처리되지 않으면 응답으로 HTTP 상태 코드와 함께 아래와 같은 에러 객체가 돌아옵니다." official-vendor-doc 토스페이먼츠 API 의 실패 응답 정확히 어떤 status code 가 어떤 code 와 매핑되는지의 전체 표는 본 인용에 없음 — 대표 코드만
TOSS-ERR-C3 인증 실패 시 UNAUTHORIZED_KEY 코드 — 인증되지 않은 시크릿/클라이언트 키 사용 시 [§대표 에러 코드 — UNAUTHORIZED_KEY] "인증되지 않은 시크릿 키 혹은 클라이언트 키" official-vendor-doc 토스페이먼츠 API key 인증 단계 만료된 키 vs 비활성화 키의 분기는 본 인용에 없음
TOSS-ERR-C4 validation 실패 코드 어휘: INVALID_REQUEST (잘못된 요청), INVALID_REQUIRED_PARAM (필수 파라미터 누락) [§대표 에러 코드 — INVALID_REQUEST] + [§대표 에러 코드 — INVALID_REQUIRED_PARAM] (위 인용) official-vendor-doc 토스페이먼츠 API 의 schema validation 단계 GitHub 의 missing_field / invalid 등 6개 어휘 같은 fine-grained 분류는 없음 — 토스는 더 coarse
TOSS-ERR-C5 business rule 위반 코드 사례: ALREADY_PROCESSED_PAYMENT (이미 처리된 결제), NOT_CANCELABLE_PAYMENT (취소 불가 결제), REJECT_CARD_PAYMENT (한도초과/잔액부족) [§대표 에러 코드 — ALREADY_PROCESSED_PAYMENT/NOT_CANCELABLE_PAYMENT/REJECT_CARD_PAYMENT] (위 인용) official-vendor-doc 결제 도메인의 business rule 카탈로그 이 코드들이 retryable 인지 final 인지는 code 명만으로 추론. 명시적 retryable 필드 없음
TOSS-ERR-C6 시스템 / provider 오류 코드: FAILED_INTERNAL_SYSTEM_PROCESSING (내부 시스템 실패), PROVIDER_ERROR (일시적 오류) [§대표 에러 코드 — FAILED_INTERNAL_SYSTEM_PROCESSING/PROVIDER_ERROR] (위 인용) official-vendor-doc 토스 내부 / 카드사 등 외부 provider 오류 분리 client 가 retry 해야 할지 즉시 final 처리할지의 정확한 가이드는 본 인용에 없음 ("일시적" 이라는 표현으로 retry 유도만 시사)
TOSS-ERR-C7 에러 객체 안에 traceId 필드가 포함된다는 사실은 본 페이지 인용에는 명시 없음 — 별도 채널 (헤더?) 가능성 (부재 자체가 claim) needs-confirmation 운영 디버깅 시 traceId 활용 traceId 가 없다는 뜻도 아님 — 본 페이지의 범위 밖. 별도 가이드 페이지 확인 필요

Usage Boundaries / 적용 경계

  • 이 자료가 직접 증명하는 것:
    • TOSS-ERR-C1 ~ C6: 토스페이먼츠 error envelope 의 {code, message} 2-field 구조 + 대표 코드 어휘 (인증/validation/business rule/system)
  • 이 자료가 증명하지 않는 것:
    • 한국 결제 vendor 전체 (KG이니시스, 카카오페이, NHN KCP 등) 가 동일 패턴이라는 결론
    • 토스가 i18n (영문 응답) 을 지원하는지 (본 페이지 한국어 메시지만)
    • retryable 여부의 정확한 알고리즘 (코드명 + status 로 추론하는 수준)
    • validation 다중 항목 오류의 표현 방식 ({code, message} 단일 → 다중 오류 합성 방식 불명)
    • traceId 의 body 내 포함 여부 (C7)
    • 성공 응답의 envelope 구조 (본 페이지는 error 만)
  • 내 프로젝트에 적용하려면 추가 확인이 필요한 것:
    • ca-tmpl 의 error.category / error.retryable 을 토스 코드 어휘에 매핑할 규칙
    • 한국어 메시지 컨벤션 (예: "...입니다" 종결) 의 ca-tmpl 적용 여부
    • validation 다중 오류 시 ca-tmpl error.details 활용

메모 / Notes

검증되지 않은 내 해석은 여기에 두지 말 것 — wiki source-summary 단계에서.

  • 응답 shape 핵심:

    { "code": "NOT_FOUND_PAYMENT", "message": "존재하지 않는 결제 정보 입니다." }
    
    • 매우 얇음. category/retryable/details/meta 모두 없음.
    • 성공 응답은 리소스 직반환 (envelope X — 본 페이지에 명시 없음, 별도 페이지 확인).
    • retryable 여부는 code semantic + HTTP status 로 추론 (e.g., PROVIDER_ERROR → 재시도 유도 메시지).
  • 장점 (추론):

    • 단순함. 한국어 메시지가 자연스러움.
    • code-driven 카탈로그 (개발자센터에서 모든 코드 문서화).
    • 학습 곡선 ↓ — 작은 팀/주니어 친화적.
  • 단점 (추론):

    • retryable, category, validation 항목별 풀이가 1급 영역에 없음.
    • 다중 validation 오류 표현이 어려움 (단일 message 에 합쳐서 줘야 함).
    • traceId 가 body 가 아닌 별도 채널일 가능성 (C7) — observability 컨벤션이 단편적.
  • ca-tmpl custom envelope 와의 차이:

    • 토스: 매우 얇은 {code, message}, ca-tmpl: 더 두꺼운 {success, data, error.{code,category,message,retryable,details}, meta}.
    • ca-tmpl 이 운영 메타데이터(retryable, category, meta) 를 1급으로 가져간 점이 정밀.
    • 토스는 성공 응답에 envelope X, ca-tmpl 은 성공도 envelope.
  • 표준 준수 / lock-in / client 호환성:

    • RFC 7807 ProblemDetail 미준수. 한국 SI/결제 진영에서 사실상 컨벤션화.
    • client 호환성: SDK 가 envelope 흡수 → 직접 사용자도 부담 낮음.
  • localization / i18n 지원 여부:

    • 한국어 메시지 단일. Accept-Language 기반 분기 명시적이지 않음.