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, optional代碼的結構化上下文,例如 retryAfter、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 欄位使用點號(.)來表示巢狀結構。

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

Content Delivery API 的表單提交若有無效回答,會以相同方式回報,並將問題 ID 作為 path。

重試機制

  • 針對 429、502 及 503 錯誤,請使用退避演算法(backoff)進行重試。若回應中包含 Retry-After 標頭或 details.retryAfter 欄位,請至少等待該秒數後再重試。
  • 請勿直接重試其他 4xx 錯誤,應先修正請求內容。
  • 若寫入操作出現 409 CONFLICT,代表資源在您讀取後已被他人修改。請重新讀取資源、合併變更,並使用新的時間戳記再次發送寫入請求。
  • 請使用 冪等性鍵值 確保建立請求可安全重試。

權限錯誤

403 回應會在 details 中說明缺失的權限,例如權杖缺乏的 requiredScope,或是當服務帳戶呼叫帳戶層級操作時顯示 reason: "principal_not_allowed"。遇到此類錯誤時,請引導使用者進行修正,而非進行重試。

請求識別碼

Content Delivery API 及 Customer API 的回應皆包含 X-Request-Id 標頭。若需聯絡支援團隊查詢特定請求,請提供此識別碼。

錯誤代碼

下表列出了目前各 API 可能回傳的所有錯誤代碼,內容由 OpenAPI 文件自動產生。

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