Kanorio

API リファレンス

エラー

すべてのKanorio APIが返す共通のエラー形式、コードとHTTPステータスの対応関係、およびリトライの処理方法について解説します。

Management API、Content Delivery API、Customer APIは、すべて同じ形式でエラーを返します。各コードはすべてのAPIで常に同じHTTPステータスに対応しているため、1つのエラーハンドラーですべての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ステータス

すべてのコードは1つのステータスに対応しています。後から追加されたコードも同じルールに従うため、未確認のコードであってもステータスに基づいて処理できます。

ステータス意味例
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でのフォーム送信において無効な回答があった場合も同様の方法で報告され、path には質問IDが使用されます。

リトライ

  • 429、502、503 はバックオフを使用してリトライしてください。レスポンスに Retry-After ヘッダーまたは details.retryAfter が含まれている場合は、指定された秒数以上待機してください。
  • 他の 4xx レスポンスは、修正せずにリトライしないでください。まずリクエストを修正してください。
  • 書き込み時の 409 CONFLICT は、読み取り後に誰かがリソースを変更したことを意味します。再度読み取りを行い、マージしてから新しいタイムスタンプで書き込みリクエストを送信してください。
  • 作成リクエストは、冪等性キーを使用して安全にリトライできるようにしてください。

権限エラー

403 レスポンスの details には不足している情報が説明されています。例えば、トークンに不足している requiredScope や、サービスアカウントがアカウントレベルの操作を呼び出した際の reason: "principal_not_allowed" などが含まれます。リトライするのではなく、ユーザーに何を修正すべきかを表示してください。

リクエストID

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