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"。遇到此类错误时,请引导用户进行修正,而非进行重试。

请求 ID

Content Delivery API 和 Customer API 的响应均包含 X-Request-Id 标头。若需联系支持团队查询特定请求,请提供此 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