Glowb Dev Docs
시작하기

크리에이터 오류 코드

크리에이터 앱이 로케일별 오류 문구를 고를 때 쓰는 코드 사전입니다.

크리에이터 오류 코드

크리에이터 앱은 로케일이 4종(ko·en·vi·jp)인데, 서버 오류 메시지는 한국어뿐이었습니다. 일본·미국·베트남 크리에이터는 무엇이 잘못됐는지 읽을 수 없었습니다. 이 문서는 그 문구를 프론트에서 로케일별로 고를 수 있도록, 서버가 내려주는 code 의 전체 사전을 정리한 것입니다.

코드 정의의 원본은 com.app.glowb.Enum.CreatorErrorCode 입니다. 이 문서는 그 enum 에서 생성했습니다.

오류 응답 형태

{
  "status": 400,
  "code": "EXPLANATION_ATTACHMENT_TOO_MANY",
  "message": "첨부는 최대 5개까지 등록할 수 있습니다. 현재 7개입니다.",
  "args": { "max": 5, "current": 7 },
  "data": null
}
필드설명
status이 오류의 HTTP 상태. 코드 하나당 항상 같은 값이라 분기 기준으로 써도 된다.
code로케일 문구를 고르는 키. 아래 표에 있는 값이 전부다.
message한국어 문장. fallback 용이다 — 아직 번역을 넣지 않은 코드는 이 값을 그대로 띄우면 된다.
args문장에 끼워 넣을 값. 슬롯이 있는 코드에서만 실린다(없으면 키 자체가 없다).
data오류와 무관한 부가 데이터. 기존 응답과 동일.

실제 HTTP 응답 코드는 대부분 200 입니다. 진짜 상태는 본문의 status 에 들어 있습니다(기존 규약 그대로).

코드 규격

  1. code 는 서버 enum 의 상수명과 항상 같다. 별도 코드 문자열을 두지 않으므로 중복이 생길 수 없다.
  2. 번호를 쓰지 않는다. CONTRACT_003 같은 값은 뜻을 읽을 수 없어 폐기했다.
  3. 형태는 도메인_대상_사유 의 대문자 스네이크다. 끝의 사유가 HTTP 상태를 결정한다.
  4. 문장에 들어갈 값은 문장에 박지 않고 args 슬롯으로 뺀다.
사유 접미사status
_REQUIRED · _INVALID · _UNSUPPORTED · _NOT_ALLOWED · _EMPTY · _MISMATCH · _TOO_MANY · _TOO_LONG · _BOUNCED · _EXPIRED400
_UNAUTHORIZED401
_FORBIDDEN · _NOT_OWNED · _NOT_VERIFIED403
_NOT_FOUND · _MISSING404
_ALREADY_* · _DUPLICATE · _EXISTS · _EXHAUSTED · _REMAINING · _CLOSED · _EXCEEDED409
_GONE · _DELETED · _VOIDED410
_TOO_LARGE413
_RATE_LIMITED429
_FAILED · _CORRUPTED · _DUPLICATED500
_UPSTREAM_FAILED502
_UNAVAILABLE503

표 밖의 예외는 둘뿐이고, 둘 다 도메인이 상태를 정합니다.

  • AUTH_TOKEN_* · AUTH_REFRESH_TOKEN_* 은 접미사와 무관하게 401 입니다.
  • 공통 인프라 코드(INTERNAL_SERVER_ERROR · DATABASE_ERROR · DB_LOCK_ERROR · CACHE_ERROR · VALIDATION_ERROR · MALFORMED_REQUEST_BODY)는 기존 코드 문자열을 물려받은 고정 값입니다.
  • 레거시 호환 코드 — INVALID_INFLUENCE_USER(404) · DUPLICATE_PORTFOLIO(409) · CONTACT_VERIFICATION_REQUIRED(403) · CONTRACT_INVALID_STATE(400) · CONTRACT_OTP_RATE_LIMIT(429) · INVALID_SNS_URL(400) · PYTHON_SERVER_ERROR(500) · TOKEN_INVALID(401) · REFRESH_TOKEN_EXPIRED(401) · SCRIPT_PDF_IMPORT_FAILED(502) · SERVER_ERROR(500) · ACCOUNT_WITHDRAWN(401). 이름이 규칙을 따르지 않지만 프론트가 이미 이 이름으로 분기하고 있어 보존합니다.

이 다섯은 한때 규격에 맞게 개명·분할했다가 되돌린 것입니다. 크리에이터 앱과 모바일 앱이 옛 이름으로 분기하고 있어 재신청 안내 토스트, 마이페이지 홈 리다이렉트, 포트폴리오 중복 안내, 연락처 재인증 모달, 온보딩 탈출구가 조용히 죽었습니다. 상태코드는 그대로라 상태 분기만으로는 드러나지 않습니다. 쪼갰던 채널·대상 정보는 args.channel · args.target 으로 살렸습니다.

2026-09-09 재감사에서 네 건을 더 찾아 되돌렸습니다 — 포트폴리오 SNS 크롤링의 INVALID_SNS_URL·PYTHON_SERVER_ERROR (크리에이터 링크 입력 화면과 어드민 콜드메일이 함께 분기합니다), 토큰 갱신의 TOKEN_INVALID·REFRESH_TOKEN_EXPIRED.

code 문자열은 프론트의 번역 키입니다. 한 번 배포한 코드는 이름을 바꾸지 않습니다. 뜻이 달라지면 새 코드를 추가하고 옛 코드는 사용처를 지웁니다.

프론트 적용 방법

프론트(glowb-frontend)는 앱 공용 오류 사전과 번역 단계를 이미 갖추고 있습니다. 새 코드가 생기면 사전에 키만 추가하면 됩니다.

  • 사전 위치: packages/ui/src/lib/api-errors/{ko,en,jp,vi}.json. 키는 서버 code 그대로, 값은 로케일 문구입니다. 슬롯은 서버 args 키와 같은 이름을 씁니다.
  • 번역 단계: 크리에이터 apps/glowb-ai-creator/apis/index.ts 와 광고주·에이전시 packages/corp-shared/src/http.ts 가 오류 응답을 localizeApiResponse 로 통과시켜 message 를 로케일 문구로 바꿉니다. 서버 원문은 rawMessage 에 남습니다.
  • 로케일 판정: URL 첫 경로(/en/…) → <html lang> → NEXT_LOCALE 쿠키 → 브라우저 언어 → ko 순입니다.
  • 폴백: 사전에 없는 코드이거나 슬롯 값이 빠지면 서버 message(한국어)를 그대로 씁니다. 그래서 서버에 새 코드가 먼저 배포돼도 화면이 비지 않고, 사전 키가 추가되면 그때부터 번역됩니다.
packages/ui/src/lib/api-errors/en.json
{
  "SUBMISSION_ITEMS_EMPTY": "There is nothing to submit.",
  "EXPLANATION_ATTACHMENT_TOO_MANY": "Up to {max} attachments allowed. You have {current}.",
  "REQUEST_ARGUMENT_INVALID": "Invalid request value. ({reason})"
}

code 로 분기하는 화면 로직(예: 특정 코드면 모달 열기)은 번역과 별개입니다. 서버 코드명이 바뀌면 그 분기도 함께 고쳐야 합니다. 이 문서의 변경 이력에 프론트 대응이 필요한 항목을 적어 둡니다.

입력값 검증 오류

@Valid 실패는 코드가 항상 VALIDATION_ERROR 하나입니다. 어느 필드가 무엇을 어겼는지는 args.errors 에 실립니다.

{
  "status": 400,
  "code": "VALIDATION_ERROR",
  "message": "받는 사람은 필수입니다, 기본 주소는 필수입니다",
  "args": {
    "errors": [
      { "field": "recipientName", "code": "VALIDATION_REQUIRED", "message": "받는 사람은 필수입니다" },
      { "field": "baseAddress",   "code": "VALIDATION_REQUIRED", "message": "기본 주소는 필수입니다" }
    ]
  }
}

필드별 코드는 어긴 제약이 무엇인지를 가리킵니다. field 와 조합하면 한국어 문장 없이도 문구를 만들 수 있습니다.

필드 코드어긴 제약
VALIDATION_REQUIRED@NotNull · @NotBlank · @NotEmpty
VALIDATION_EMAIL@Email
VALIDATION_SIZE@Size · @Length
VALIDATION_PATTERN@Pattern
VALIDATION_MUST_BE_TRUE@AssertTrue (약관 동의 등)
VALIDATION_MUST_BE_FALSE@AssertFalse
VALIDATION_RANGE@Min · @Max · @Positive 계열
VALIDATION_INVALID그 외

코드 사전

전체 175개입니다. 슬롯 열이 있는 코드는 args 가 함께 내려옵니다.

공통

모든 크리에이터 엔드포인트에서 나올 수 있다. GlobalExceptionHandler 가 채운다.

코드status한국어 문구슬롯
INTERNAL_SERVER_ERROR500서버 내부 오류가 발생했습니다.—
DATABASE_ERROR500데이터베이스 처리 중 오류가 발생했습니다.—
DB_LOCK_ERROR503일시적인 처리 지연이 발생했습니다. 잠시 후 다시 시도해주세요.—
CACHE_ERROR503캐시 서버 처리 중 오류가 발생했습니다.—
RESOURCE_NOT_FOUND404요청하신 리소스를 찾을 수 없습니다.—
VALIDATION_ERROR400입력값이 올바르지 않습니다.errors
MALFORMED_REQUEST_BODY400'{field}' 값의 형식이 올바르지 않습니다.field(필드를 알 때만)
REQUEST_PARAM_REQUIRED400필수 요청 값 '{param}'이 없습니다.param
REQUEST_PART_REQUIRED400필수 업로드 항목 '{part}'이 없습니다.part
REQUEST_ARGUMENT_INVALID400요청 값이 올바르지 않습니다. ({reason})reason
PATH_VARIABLE_INVALID400'{name}' 값의 형식이 올바르지 않습니다.name
UPLOAD_TOO_LARGE413업로드 용량이 허용 범위를 초과했습니다.—
REQUEST_HEADER_REQUIRED400필수 요청 헤더 '{header}'이 없습니다.header
REQUEST_METHOD_NOT_ALLOWED400지원하지 않는 요청 방식입니다.method
REQUEST_CONTENT_TYPE_UNSUPPORTED400지원하지 않는 요청 형식입니다.contentType

인증·인가

AUTH_TOKEN_* 과 AUTH_FORBIDDEN 은 시큐리티 필터 단계에서 나가므로 봉투가 다르다(아래 “아직 규격 밖인 구간” 참고).

코드status한국어 문구슬롯
AUTH_TOKEN_REQUIRED401로그인이 필요합니다.—
AUTH_TOKEN_EXPIRED401로그인이 만료되었습니다. 다시 로그인해주세요.—
TOKEN_INVALID401유효하지 않은 토큰입니다. 다시 로그인해주세요.—
REFRESH_TOKEN_EXPIRED401로그인 세션이 만료되었습니다. 다시 로그인해주세요.—
AUTH_FORBIDDEN403접근 권한이 없습니다.—
ACCOUNT_WITHDRAWN401탈퇴한 계정입니다. 다시 로그인할 수 없습니다.—
AUTH_MEMBER_NOT_FOUND404회원 정보를 찾을 수 없습니다.—
SOCIAL_LOGIN_TYPE_UNSUPPORTED400지원하지 않는 소셜 로그인입니다.—
SOCIAL_LOGIN_UPSTREAM_FAILED502소셜 로그인 제공자와 통신하지 못했습니다. 잠시 후 다시 시도해주세요.provider
SOCIAL_LOGIN_STATE_REQUIRED400로그인 요청 정보가 없습니다. 처음부터 다시 로그인해주세요.—
SOCIAL_LOGIN_STATE_INVALID400로그인 요청이 만료되었거나 올바르지 않습니다. 처음부터 다시 로그인해주세요.—

크리에이터 계정

코드status한국어 문구슬롯
INVALID_INFLUENCE_USER404크리에이터 정보를 찾을 수 없습니다.—
CREATOR_SIGNUP_FAILED500회원가입 처리 중 오류가 발생했습니다.—
CREATOR_WITHDRAWAL_FAILED500회원 탈퇴 처리 중 오류가 발생했습니다.—
CREATOR_LOGIN_FAILED500로그인 처리 중 오류가 발생했습니다.—
BUSINESS_PROFILE_NOT_FOUND404기업 정보를 찾을 수 없습니다.—
RECRUIT_CORP_SAVE_FAILED500기업 등록 신청 저장에 실패했습니다.—

연락처 인증

CONTACT_VERIFICATION_EMAIL_BOUNCED 는 프론트가 이미 분기에 쓰고 있어 이름을 바꾸지 않는다.

코드status한국어 문구슬롯
CONTACT_VERIFICATION_TARGET_REQUIRED400인증할 연락처가 필요합니다.target
CONTACT_VERIFICATION_REQUIRED403이메일 또는 전화번호 인증이 필요합니다.channel · maskedContact
CONTACT_VERIFICATION_EMAIL_FORMAT_INVALID400유효한 이메일 주소를 입력해주세요.—
CONTACT_VERIFICATION_CODE_REQUIRED400인증번호를 입력해주세요.—
CONTACT_VERIFICATION_CODE_MISMATCH400인증번호가 올바르지 않습니다.—
CONTACT_VERIFICATION_EXPIRED400인증번호가 만료되었습니다. 다시 요청해주세요.—
CONTACT_VERIFICATION_RATE_LIMITED429인증번호 요청이 너무 많습니다. 잠시 후 다시 시도해주세요.—
CONTACT_VERIFICATION_EMAIL_SEND_FAILED500인증 이메일 발송에 실패했습니다. 잠시 후 다시 시도해주세요.—
CONTACT_VERIFICATION_SMS_SEND_FAILED500인증 문자 발송에 실패했습니다. 잠시 후 다시 시도해주세요.—
CONTACT_VERIFICATION_SMS_UNSUPPORTED400해외 전화번호는 SMS 인증 대상이 아닙니다. 이메일 인증을 진행해주세요.telDialCode · maskedContact · saved
CONTACT_VERIFICATION_EMAIL_BOUNCED400이메일 수신이 실패했습니다. 다른 이메일로 다시 인증해주세요.maskedContact

캠페인

코드status한국어 문구슬롯
CAMPAIGN_NOT_FOUND404존재하지 않는 캠페인입니다.collabNo
CAMPAIGN_RECRUITMENT_CLOSED409모집이 마감된 캠페인입니다.—
CAMPAIGN_SELECTION_CLOSED409이미 선정이 마감된 캠페인입니다.—
CAMPAIGN_SNS_CONFIG_CORRUPTED500캠페인 SNS 설정이 올바르지 않습니다.collabNo
CAMPAIGN_CATEGORY_INVALID400존재하지 않는 카테고리입니다.category

캠페인 지원

코드status한국어 문구슬롯
APPLICATION_NOT_FOUND404신청 건을 찾을 수 없습니다.applicationId
APPLICATION_NOT_OWNED403본인의 신청 건이 아닙니다.—
CAMPAIGN_ALREADY_APPLIED409이미 해당 캠페인에 신청하셨습니다.reason
APPLICATION_CAMPAIGN_FAILED500캠페인 신청에 실패했습니다.—
APPLICATION_UNIT_PRICE_INVALID400단가 값이 올바르지 않습니다.—

단가 협상

코드status한국어 문구슬롯
NEGOTIATION_NOT_FOUND404단가 제안을 찾을 수 없습니다.—
NEGOTIATION_NOT_OWNED403본인의 단가 제안이 아닙니다.—
NEGOTIATION_ALREADY_RESPONDED409이미 응답한 단가 제안입니다.—
NEGOTIATION_ACTION_INVALID400유효하지 않은 응답입니다. (accept 또는 reject)—
NEGOTIATION_VOIDED410취소된 단가 제안입니다. 새로 받은 제안을 확인해주세요.—

제공 옵션

코드status한국어 문구슬롯
PROVIDED_OPTION_NOT_OWNED403본인의 신청 건이 아닙니다.—
PROVIDED_OPTION_STATE_INVALID400현재 상태에서는 제공 옵션을 선택할 수 없습니다.—
PROVIDED_OPTION_CHOICE_INVALID400존재하지 않는 옵션 선택입니다.—
PROVIDED_OPTION_MULTI_CHOICE_NOT_ALLOWED400이 옵션은 하나만 선택할 수 있습니다.—

제출물

코드status한국어 문구슬롯
SUBMISSION_ITEM_NOT_FOUND404제출물을 찾을 수 없습니다.itemId
SUBMISSION_ROUND_NOT_FOUND404검수 라운드를 찾을 수 없습니다.reviewId
SUBMISSION_ROUND_ID_REQUIRED400검수 라운드 ID는 필수입니다.—
SUBMISSION_ITEM_TYPE_REQUIRED400제출물 타입은 필수입니다.—
SUBMISSION_ITEMS_EMPTY400제출할 제출물이 없습니다.—
SUBMISSION_DRAFT_ITEMS_EMPTY400저장할 제출물이 없습니다.—
SUBMISSION_FILE_REQUIRED400{typeLabel} 파일을 업로드해주세요.typeLabel · itemType
SUBMISSION_DELETE_NOT_ALLOWED400스크립트만 삭제할 수 있습니다.—
SUBMISSION_DELETE_ALREADY_SUBMITTED409이미 제출한 스크립트는 삭제할 수 없습니다.—
SUBMISSION_VERSION_NOT_FOUND404버전 {version}을 찾을 수 없습니다.version

검수 피드백

코드status한국어 문구슬롯
FEEDBACK_NOT_FOUND404피드백을 찾을 수 없습니다.—
FEEDBACK_EDIT_FORBIDDEN403관리자만 피드백을 수정·삭제할 수 있습니다.—
FEEDBACK_CREATE_FORBIDDEN403관리자만 피드백을 추가할 수 있습니다.—
FEEDBACK_CONTENT_REQUIRED400피드백 내용을 입력해주세요.—

AI 검수

코드status한국어 문구슬롯
AI_REVIEW_INFO_NOT_FOUND404검수 정보를 찾을 수 없습니다.—
AI_REVIEW_NOT_OWNED403본인 신청 건에 대해서만 AI 검수를 요청할 수 있습니다.—
SCRIPT_CONTENT_EMPTY400작성된 스크립트 내용이 없습니다. 스크립트를 작성한 후 검수를 요청해주세요.—
AI_REVIEW_ITEM_TYPE_INVALID400영상 제출물만 AI 검수를 요청할 수 있습니다.—
AI_REVIEW_VIDEO_REQUIRED400업로드된 영상이 없습니다. 영상을 업로드한 후 검수를 요청해주세요.—
AI_REVIEW_CONTENT_TYPE_INVALID400유효하지 않은 검수 종류입니다. (SCRIPT 또는 VIDEO)—
AI_REVIEW_COLLAB_NO_REQUIRED400캠페인 번호는 필수입니다.—
AI_REVIEW_VIDEO_URL_REQUIRED400영상 URL은 필수입니다.—
AI_REVIEW_QUOTA_EXHAUSTED409AI 검수 요청 횟수를 모두 사용했습니다.—
AI_REVIEW_QUOTA_REMAINING409아직 남은 검수 횟수가 있어 추가 요청할 수 없습니다.—
AI_REVIEW_UPSTREAM_FAILED502AI 검수 서버 연동에 실패했습니다. 잠시 후 다시 시도해주세요.—

스크립트 PDF 가져오기

코드status한국어 문구슬롯
SCRIPT_IMPORT_FILE_REQUIRED400PDF 파일을 첨부해주세요.—
SCRIPT_IMPORT_NOT_OWNED403본인 신청 건에 대해서만 스크립트 가져오기가 가능합니다.—
SCRIPT_PDF_IMPORT_FAILED502PDF를 스크립트로 변환하지 못했습니다. 기존 초안은 유지됩니다. 잠시 후 다시 시도해주세요.—
SCRIPT_IMPORT_FAILED500스크립트 가져오기에 실패했습니다.—

최종 제작물

코드status한국어 문구슬롯
FINAL_SUBMISSION_NOT_FOUND404제출된 최종 제작물이 없습니다. 먼저 제출해주세요.—
FINAL_SUBMISSION_PHASE_NOT_ALLOWED400업로드/정산 단계에서만 최종 제작물을 제출할 수 있습니다.—
FINAL_SUBMISSION_FIRST_SUBMIT_REQUIRED400아직 제출되지 않았습니다. 최초 제출을 먼저 진행해주세요.—

소명

코드status한국어 문구슬롯
EXPLANATION_TARGET_NOT_FOUND404최종 제출물이 없습니다. 제출 후에 이용할 수 있습니다.—
EXPLANATION_REQUEST_BODY_REQUIRED400요청 본문이 필요합니다.—
EXPLANATION_CONTENT_REQUIRED400소명 내용이나 첨부 중 하나는 있어야 합니다.—
EXPLANATION_ATTACHMENT_TOO_MANY400첨부는 최대 {max}개까지 등록할 수 있습니다. 현재 {current}개입니다.max · current
EXPLANATION_ATTACHMENT_URL_TOO_LONG400첨부 URL이 너무 깁니다. (최대 {maxLength}자)maxLength
EXPLANATION_ATTACHMENT_SERIALIZE_FAILED500첨부 처리 중 오류가 발생했습니다.—

제출 링크(무인증)

로그인 없이 열리는 매직링크 화면이라, 로케일을 URL 이나 브라우저 설정에서 잡아야 한다.

코드status한국어 문구슬롯
SUBMIT_LINK_NOT_FOUND404유효하지 않은 링크입니다.—
SUBMIT_LINK_GONE410만료되었거나 사용할 수 없는 링크입니다.—
SUBMIT_LINK_ROUND_MISMATCH400이 링크로 제출할 수 없는 검수 라운드입니다.—
SUBMIT_LINK_ROUND_ID_REQUIRED400검수 라운드 ID는 필수입니다.—
SUBMIT_LINK_APPLICATION_NOT_FOUND404캠페인 신청을 찾을 수 없습니다.applicationId
SUBMIT_LINK_OWNER_NOT_FOUND404신청 소유자를 확인할 수 없습니다.—
SUBMIT_LINK_PROGRESS_ITEM_NOT_FOUND404제출 대상을 찾을 수 없습니다.progressItemId
코드status한국어 문구슬롯
DM_LINK_VERIFY_UNAVAILABLE503인스타그램 DM 인증을 지금은 사용할 수 없습니다.—
DM_LINK_CODE_ISSUE_FAILED500인증 코드 발급에 실패했습니다. 잠시 후 다시 시도해주세요.—

배송지

코드status한국어 문구슬롯
DELIVERY_ADDRESS_NOT_FOUND404배송지를 찾을 수 없습니다.addressId
DELIVERY_ADDRESS_NOT_OWNED403본인의 배송지가 아닙니다.—
DELIVERY_ADDRESS_DELETED410이미 삭제된 배송지입니다.—
DELIVERY_ADDRESS_INPUT_REQUIRED400배송지를 선택하거나 새 배송지를 입력해주세요.—
DELIVERY_INFO_NOT_FOUND404배송 정보가 없습니다.applicationId

전자계약

코드status한국어 문구슬롯
CONTRACT_NOT_FOUND404존재하지 않는 계약서입니다.—
CONTRACT_NOT_OWNED403해당 계약서에 접근 권한이 없습니다.—
CONTRACT_VOIDED410폐기된 계약서입니다.—
CONTRACT_ALREADY_SIGNED409이미 서명된 계약서입니다.—
CONTRACT_INVALID_STATE400현재 상태에서는 해당 작업을 수행할 수 없습니다.requiredStep
CONTRACT_FIELD_REQUIRED400{label} 항목을 입력해주세요.label · field
CONTRACT_PAYMENT_METHOD_REQUIRED400지급 방법을 선택해주세요.—
CONTRACT_PAYMENT_METHOD_UNSUPPORTED400지원하지 않는 지급수단입니다.method
CONTRACT_PAYMENT_INFO_REQUIRED400지급 정보를 입력해주세요.—
CONTRACT_OTP_EMAIL_MISSING404등록된 이메일이 없습니다.—
CONTRACT_OTP_PHONE_MISSING404등록된 전화번호가 없습니다.—
CONTRACT_OTP_RATE_LIMIT429인증번호 요청이 너무 많습니다. 잠시 후 다시 시도해주세요.—
CONTRACT_OTP_MISMATCH400인증번호가 올바르지 않습니다.—
CONTRACT_OTP_EMAIL_SEND_FAILED500인증 이메일 발송에 실패했습니다. 잠시 후 다시 시도해주세요.—
CONTRACT_OTP_SMS_SEND_FAILED500인증 문자 발송에 실패했습니다. 잠시 후 다시 시도해주세요.—
CONTRACT_PDF_GENERATION_FAILED500계약서 PDF 생성에 실패했습니다.—
CONTRACT_DOCUMENT_UPLOAD_FAILED500계약서 서류 업로드에 실패했습니다.—
CONTRACT_PAYMENT_INFO_SERIALIZE_FAILED500지급 정보 처리 중 오류가 발생했습니다.—
CONTRACT_PAYMENT_INFO_RENDER_FAILED500계약서 지급 정보를 불러오지 못했습니다.—
CONTRACT_VARIABLE_UPDATE_FAILED500계약서 정보 갱신에 실패했습니다.—

가이드라인 조회

코드status한국어 문구슬롯
GUIDELINE_NOT_FOUND404존재하지 않는 가이드라인입니다.collabNo
GUIDELINE_NOT_OWNED403해당 가이드라인에 접근 권한이 없습니다.—

Instagram 연동

코드status한국어 문구슬롯
INSTAGRAM_OAUTH_CODE_REQUIRED400인증 코드가 필요합니다.—
INSTAGRAM_OAUTH_STATE_REQUIRED400인증 요청 정보가 필요합니다.—
INSTAGRAM_OAUTH_STATE_INVALID400인증 요청 정보가 올바르지 않습니다. 처음부터 다시 시도해주세요.—
INSTAGRAM_UPSTREAM_FAILED502Instagram 인증에 실패했습니다. 잠시 후 다시 시도해주세요.—
INSTAGRAM_BUSINESS_ACCOUNT_NOT_FOUND404연결된 Instagram 비즈니스 계정이 없습니다. Facebook 페이지와 Instagram 계정을 먼저 연결해주세요.—
INSTAGRAM_ACCOUNT_ALREADY_CONNECTED409이미 다른 계정에 연동된 Instagram 계정입니다.—
INSTAGRAM_ACCOUNT_NOT_FOUND404연동된 계정을 찾을 수 없습니다.—
INSTAGRAM_ACCOUNT_NOT_OWNED403본인의 연동 계정이 아닙니다.—
INSTAGRAM_ACCOUNT_TYPE_INVALID400Instagram 계정이 아닙니다.—
INSTAGRAM_RECHECK_UPSTREAM_FAILED502게시물 재검수 서버에 연결하지 못했습니다. 잠시 후 다시 시도해주세요.—
INSTAGRAM_RECHECK_FAILED500게시물 재검수 중 오류가 발생했습니다.—

포트폴리오

코드status한국어 문구슬롯
PORTFOLIO_NOT_FOUND404존재하지 않는 포트폴리오입니다.—
DUPLICATE_PORTFOLIO409사용자당 하나의 포트폴리오만 등록할 수 있습니다.—
PORTFOLIO_SAVE_FAILED500포트폴리오 저장에 실패했습니다.—
PORTFOLIO_SNS_INFO_NOT_FOUND404존재하지 않는 SNS 정보입니다.—
PORTFOLIO_REFERENCE_REQUIRED400레퍼런스 URL을 입력해주세요.—
PORTFOLIO_REFERENCE_NOT_FOUND404존재하지 않는 레퍼런스 정보입니다.—
PORTFOLIO_THEME_INVALID400존재하지 않는 테마입니다.—
PORTFOLIO_THEME_COLOR_INVALID400존재하지 않는 색상입니다.—
PORTFOLIO_THEME_FONT_INVALID400존재하지 않는 폰트입니다.—
PORTFOLIO_REFERENCE_METRIC_INVALID400존재하지 않는 성과 수치입니다.—
PORTFOLIO_FOLLOWER_GENDER_INVALID400존재하지 않는 팔로워 성별입니다.gender
PORTFOLIO_AI_UPSTREAM_FAILED502AI 생성 중 일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요.—
INVALID_SNS_URL400유효하지 않은 SNS URL입니다.—
PYTHON_SERVER_ERROR500SNS 정보를 불러오지 못했습니다. 잠시 후 다시 시도해주세요.—
SERVER_ERROR500SNS 정보를 불러오는 중 연결에 실패했습니다. 잠시 후 다시 시도해주세요.—

알림

코드status한국어 문구슬롯
NOTIFICATION_NOT_FOUND404존재하지 않는 알림입니다.—
NOTIFICATION_NOT_OWNED403해당 알림에 접근할 권한이 없습니다.—
NOTIFICATION_IDS_REQUIRED400알림 ID 목록이 필요합니다.—

AFFILIATE

코드status한국어 문구슬롯
AFFILIATE_NOT_FOUND404존재하지 않는 상품입니다.—
AFFILIATE_QUERY_FAILED500어필리에이트 상품 조회에 실패했습니다.—
AFFILIATE_IMAGE_LOAD_FAILED500상품 이미지를 불러오지 못했습니다.—

파일 업로드

코드status한국어 문구슬롯
FILE_REQUIRED400파일이 비어 있습니다.—
FILE_EMPTY400업로드된 파일이 비어 있습니다. 네트워크 상태를 확인한 뒤 다시 업로드해 주세요.—
FILE_NAME_REQUIRED400파일명이 없습니다.—
FILE_CONTENT_TYPE_REQUIRED400파일 형식(Content-Type)이 필요합니다.—
FILE_TYPE_UNSUPPORTED400지원하지 않는 파일 형식입니다.contentType
FILE_UPLOAD_FAILED500파일 업로드 중 오류가 발생했습니다.—
FILE_UPLOAD_URL_ISSUE_FAILED500업로드 URL 발급에 실패했습니다.—

변경 이력

2026-10-08 — 공통 처리기 정리

이전이후프론트 대응
INVALID_ARGUMENT(400, 서비스 원문)REQUEST_ARGUMENT_INVALID(400). 원문은 args.reason 에 실림사전 키 추가(reason 슬롯 포함). 추가 전에는 서버 문구가 그대로 보임
MALFORMED_REQUEST_BODY(args 없음)필드를 알 때 args.field 를 함께 보냄없음(사전 키가 이미 있음)
CACHE_ERROR · DB_LOCK_ERROR · DATABASE_ERROR · RESOURCE_NOT_FOUND같은 코드·상태·문구(enum 경유로 정리만)없음

아직 규격 밖인 구간

아래는 이 사전을 그대로 쓸 수 없는 경로입니다. 프론트는 당분간 예외 처리가 필요합니다.

구간지금 내려가는 형태프론트가 할 일
토큰 만료·누락HTTP 401 + {"status":401,"code":"AUTH_TOKEN_EXPIRED","message":"…"} — 봉투가 통일돼 공통 파서로 읽힌다. 다만 HTTP 상태가 실제 401 이라 200 을 전제한 코드는 확인이 필요하다code 로 재로그인 유도
권한 불일치HTTP 403 + {"status":403,"code":"AUTH_FORBIDDEN","message":"…"}code 로 분기
컨테이너 오류 포워딩 /error실제 오류 상태 + {"status","code","message"}. code 는 RESOURCE_NOT_FOUND(404) 또는 INTERNAL_SERVER_ERROR공통 fallback
AI 검수 비동기 실패응답 자체가 없다. 검수 요청은 즉시 200 을 받고, 실패는 쿼터 환불로만 끝난다결과 폴링에서 판단해야 한다
nginx 업로드 용량 초과앱에 닿지 않고 nginx 413 HTMLJSON 파싱 실패를 용량 초과로 안내

크리에이터가 닿는 경로는 이 사전대로 치환을 마쳤습니다. 다만 광고주·어드민과 코드를 공유하는 메서드가 있어, 일부 엔드포인트는 여전히 옛 코드(INVALID_DATA 등)를 냅니다. 프론트 번역 단계는 사전에 없는 코드를 서버 message 로 흘려보내므로, 옛 코드가 남은 화면도 비지 않습니다.

On this page