Kanorio

API 레퍼런스

오류

모든 Kanorio API가 반환하는 공통 오류 형식, 코드와 HTTP 상태 매핑, 그리고 재시도 처리 방법을 설명합니다.

Management API, Content Delivery API, Customer API는 모두 동일한 형식으로 오류를 반환합니다. 각 코드는 모든 API에서 항상 동일한 HTTP 상태 코드와 매핑되므로, 하나의 오류 핸들러로 모든 API를 처리할 수 있습니다.

{
  "error": {
    "code": "SLUG_TAKEN",
    "message": "Another post already uses this slug.",
    "details": { "slug": "how-we-feed-our-starter" }
  }
}
필드타입참고
error.codestring안정적이고 기계가 읽을 수 있는 코드입니다. 조건 분기에 사용하십시오.
error.messagestring로그 및 개발자를 위한 영어 문장입니다. 언제든지 변경될 수 있으므로 이 값을 기준으로 로직을 작성하지 마십시오.
error.detailsobject, optionalretryAfter, availableAt, issues, requiredScope 등 코드에 대한 구조화된 컨텍스트입니다.

성공적인 응답에는 error가 포함되지 않으며, API가 성공 여부를 ok 플래그로 감싸지도 않습니다.

코드별 HTTP 상태

모든 코드는 하나의 상태와 매핑됩니다. 나중에 추가되는 코드도 동일한 규칙을 따르므로, 아직 확인하지 못한 코드라도 상태를 기준으로 처리할 수 있습니다.

상태의미예시
400요청이 잘못되었거나 유효성 검사에 실패했습니다VALIDATION, INVALID_CURSOR, INVALID_로 시작하는 코드
401자격 증명이 없거나, 유효하지 않거나, 만료되었거나, 취소되었습니다UNAUTHORIZED, UNAUTHENTICATED
403자격 증명은 유효하지만 권한, 플랜, 역할 또는 모드에 의해 허용되지 않습니다FORBIDDEN, OWNER_REQUIRED, LIMIT_REACHED, LOCKED
404이 사이트에 리소스가 존재하지 않습니다NOT_FOUND, _NOT_FOUND로 끝나는 코드
405이 경로에서 지원되지 않는 메서드입니다METHOD_NOT_ALLOWED
409현재 상태와 충돌합니다(오래된 쓰기, 사용 중인 슬러그, 중복 등)CONFLICT, SLUG_TAKEN, IDEMPOTENCY_CONFLICT
413업로드 파일이 너무 큽니다FILE_TOO_LARGE
422입력값은 유효하지만 비즈니스 규칙에 의해 허용되지 않습니다SITE_NOT_PUBLISHED, ASSET_IN_USE
429요청이 너무 많거나 백엔드가 혼잡합니다. 나중에 다시 시도하십시오RATE_LIMITED, SEARCH_BUSY, ANALYTICS_BUSY
500예기치 않은 서버 오류가 발생했습니다INTERNAL
502, 503업스트림 서비스가 실패했거나 일시적으로 사용할 수 없습니다UPLOAD_FAILED, SERVICE_UNAVAILABLE, SHARED_SENDER_PAUSED

API 레퍼런스의 각 작업에는 반환 가능한 코드와 해당 작업에서의 의미가 나열되어 있습니다. OpenAPI 문서에도 x-kanorio-errors로 동일한 목록이 포함되어 있습니다.

유효성 검사 오류

VALIDATION은 details.issues 내의 모든 실패한 필드를 나열합니다. path는 점(dot)을 사용하여 중첩 구조를 나타냅니다.

{
  "error": {
    "code": "VALIDATION",
    "message": "Input does not match the capability schema.",
    "details": {
      "issues": [
        { "path": "title", "message": "Required", "code": "invalid_type" }
      ]
    }
  }
}

Content Delivery API에서 폼 제출 시 유효하지 않은 답변이 있을 경우 동일한 방식으로 보고되며, path에는 질문 ID가 사용됩니다.

재시도(Retry)

  • 429, 502, 503 오류는 백오프(backoff)를 사용하여 재시도하십시오. 응답에 Retry-After 헤더나 details.retryAfter가 포함된 경우, 해당 시간(초)만큼 대기하십시오.
  • 다른 4xx 응답은 수정 없이 재시도하지 마십시오. 먼저 요청을 수정해야 합니다.
  • 쓰기 작업 중 409 CONFLICT가 발생하면, 읽기 작업 이후 누군가 리소스를 변경했음을 의미합니다. 리소스를 다시 읽고 병합한 다음, 새로운 타임스탬프로 쓰기 요청을 보내십시오.
  • 생성 요청은 멱등성 키를 사용하여 안전하게 재시도할 수 있도록 하십시오.

권한 오류

403 응답의 details에는 무엇이 부족한지 설명되어 있습니다. 예를 들어 토큰에 부족한 requiredScope나, 서비스 계정이 계정 수준의 작업을 호출했을 때의 reason: "principal_not_allowed" 등이 포함됩니다. 재시도하는 대신 사용자에게 무엇을 수정해야 하는지 안내하십시오.

요청 ID(Request IDs)

Content Delivery API와 Customer API 응답에는 X-Request-Id 헤더가 포함됩니다. 특정 요청에 대해 지원팀에 문의할 때 이 ID를 함께 제공하십시오.

오류 코드

아래 표는 OpenAPI 문서에서 생성된, 각 API가 현재 반환할 수 있는 모든 코드 목록입니다.

Management API codes

CodeHTTP status
EMPTY_SLUG400
INVALID_BODY400
INVALID_CURSOR400
INVALID_EDITED_PATH400
INVALID_FORMAT400
INVALID_ORDER400
INVALID_SUBDOMAIN400
UNSUPPORTED_EDITED_PATH400
VALIDATION400
UNAUTHENTICATED401
UNAUTHORIZED401
CUSTOM_DOMAIN_CHANGE_FORBIDDEN403
CUSTOM_DOMAIN_LIMIT_REACHED403
FORBIDDEN403
LIMIT_REACHED403
MODERATION_LOCKED403
OWNER_REQUIRED403
PLAN_CANNOT_PUBLISH403
PRO_REQUIRED403
REDIRECT_LIMIT403
SUBDOMAIN_CHANGE_FORBIDDEN403
TOKEN_WEBSITE_SCOPED403
HEADER_NOT_FOUND404
HOME_PAGE_NOT_FOUND404
NOT_FOUND404
OWNER_NOT_FOUND404
PAGE_NOT_FOUND404
PARENT_NOT_FOUND404
PRODUCT_NOT_FOUND404
WEBSITE_NOT_FOUND404
METHOD_NOT_ALLOWED405
CONFLICT409
CUSTOM_DOMAIN_TAKEN409
HAS_CHILDREN409
HOSTED_ONLY409
HOSTNAME_CONFLICT409
IDEMPOTENCY_CONFLICT409
IDEMPOTENCY_IN_PROGRESS409
KEY_TAKEN409
PRIMARY_HEADER_PROTECTED409
READD_COOLDOWN409
REDIRECT_CONFLICT409
SLUG_TAKEN409
SUBDOMAIN_TAKEN409
TAKEN409
BLOCKED422
BREADCRUMB_PARENT_INVALID422
CONTENT_VALIDATION_FAILED422
CORE_SECTION_VIOLATION422
CUSTOM_DOMAIN_BLOCKED422
CUSTOM_DOMAIN_HIGH_RISK_TLD422
CUSTOM_DOMAIN_TOO_LONG422
DEPTH_EXCEEDED422
DNS_NOT_PROPAGATED422
DOMAIN_CHANGE_NOT_ALLOWED422
EMPTY_CONTENT422
FOREIGN_PAGE422
HIGH_RISK_TLD422
HOME_HAS_HIERARCHY422
HOME_NOT_CREATABLE422
HOME_NOT_DELETABLE422
HOME_NOT_SORTABLE422
HOME_SLUG_IMMUTABLE422
LINK_IN_BIO_DEDICATED_ENTRY422
LINK_IN_BIO_NOT_DUPLICABLE422
META_NOT_LIVE422
NO_PUBLIC_URL422
OWNERSHIP_REQUIRED422
PAGE_LIMIT_REACHED422
PARENT_NOT_ALLOWED422
RESERVED_SEGMENT422
RESERVED_SLUG422
RESERVED_SUBDOMAIN422
SANITIZE_FAILED422
SEARCH_CONSOLE_AUTH_EXPIRED422
SEARCH_CONSOLE_NOT_CONNECTED422
SEARCH_CONSOLE_PERMISSION_DENIED422
SEARCH_CONSOLE_PROPERTY_NOT_FOUND422
SEGMENT_TOO_LONG422
SITEMAP_NOT_REACHABLE422
SUBDOMAIN_MISSING422
SYSTEM_PAGE_LOCKED422
TEMPLATE_PRODUCT_LOCKED422
ANALYTICS_BUSY429
DAILY_LIMIT_REACHED429
RATE_LIMITED429
SEARCH_BUSY429
SEARCH_CONSOLE_QUOTA_EXCEEDED429
STOCK_BUSY429
INTERNAL500
SEARCH_CONSOLE_ERROR502
BUSY503
SEARCH_CONSOLE_UNAVAILABLE503
SERVICE_UNAVAILABLE503
WRITE_FROZEN503

Content Delivery API codes

CodeHTTP status
BAD_HOST400
FILE_TYPE_NOT_ALLOWED400
INVALID_ANSWERS400
INVALID_BODY400
INVALID_CURSOR400
INVALID_KIND400
INVALID_LIMIT400
INVALID_PATH400
INVALID_QUERY400
QUERY_REQUIRED400
QUERY_TOO_LONG400
QUERY_TOO_SHORT400
TOO_MANY_PARAMS400
UNKNOWN_BOT400
UNSUPPORTED_LOCALE400
VALIDATION400
VERIFICATION_EXPIRED400
NOT_PREVIEW403
COLLECTION_NOT_FOUND404
FORM_NOT_FOUND404
HEADER_NOT_FOUND404
ITEM_NOT_FOUND404
PAGE_NOT_FOUND404
PRODUCT_NOT_FOUND404
SITE_NOT_FOUND404
UNIT_NOT_FOUND404
DUPLICATE_SUBMISSION409
FILE_TOO_LARGE413
RATE_LIMITED429
SEARCH_BUSY429
QUERY_TIMEOUT503
UPLOAD_UNAVAILABLE503
UPSTREAM_UNAVAILABLE503

Customer API codes

CodeHTTP status
BAD_HOST400
INVALID_CODE400
INVALID_CURSOR400
INVALID_EMAIL400
INVALID_LIMIT400
VALIDATION400
UNAUTHENTICATED401
BOT_PROTECTION_FAILED403
DOWNLOAD_NOT_ALLOWED403
EXPIRED403
FORBIDDEN403
LIMIT_REACHED403
LOCKED403
NOT_RELEASED403
NO_ATTEMPTS_LEFT403
REVIEWS_DISABLED403
CERTIFICATE_DISABLED404
DELIVERABLE_NOT_FOUND404
NOT_FOUND404
NO_FILE404
NO_RECEIPT404
ORDER_NOT_FOUND404
SITE_NOT_FOUND404
UNIT_NOT_FOUND404
WEBSITE_NOT_FOUND404
METHOD_NOT_ALLOWED405
ALREADY_REVIEWED409
FILE_NOT_PROTECTED409
NOT_A_QUIZ409
QUIZ_NOT_READY409
ACCOUNT_BLOCKED422
ALREADY_REGISTERED422
CHALLENGE_EXPIRED422
EMAIL_NOT_VERIFIED422
METHOD_DISABLED422
VERIFY_FAILED422
RATE_LIMITED429
SHARED_SENDER_PAUSED503
SIGN_FAILED503
UPSTREAM_UNAVAILABLE503