/
LinkHarbor APIのエラーレスポンスの構造、主なエラーコードの意味、コードでの対応方法を説明します。
APIのエラーレスポンスはすべて同じ形式です。コードでは、messageのテキストではなく、errorフィールドのエラーコードを頼りにしてください。コードは変わりませんが、テキストは変わることがあり、アカウント言語に翻訳されます。
エラーレスポンスの構造
{
"error": "validation_failed",
"message": "Some of the information provided is invalid. Please check and try again.",
"details": [
{ "field": "title", "reason": "minLength", "message": "…" }
],
"request_id": "6b1f0c2e-…"
} - error
- 機械可読なコードです(例:not_found)。ほとんどのエラーではX-Error-Codeヘッダーにも入っていますが、本文のフィールドを頼りにしてください。
- message
- 人が読める説明で、アカウント言語で書かれています。APIキーの場合はワークスペースのオーナーの言語、接続したアプリの場合は接続した人の言語です。トークンのチェックによる401など、有効なトークンがない場合はAccept-Languageに従い、それもなければ英語です。言語はContent-Languageヘッダーに示されます。
- details
- 追加の情報があるときだけ含まれます。入力の検証による422では、問題ごとにfield、reason、messageを含むリストです。業務ロジックによる422やその他のすべてのエラーでは、reason、retry_after_sec、問題のリストなどを含むオブジェクトです。サイズ超過の場合はfield、reason、limitを含み、413 request_too_largeではmax_bytesとmax_kbを含みます。そのため、detailsがリストかどうかを確認してください。
- request_id
- リクエストのIDです。X-Request-Idヘッダーにも入っています。サポートに問い合わせるときは添えてください。
例外:429 rate_limitedのレスポンスにはdetailsの代わりにretry_after_secフィールドがあります。429と403 insufficient_scopeでは、本文にrequest_idがありません。トークンのチェックによる401とスキーマチェックによる422にはX-Error-Codeヘッダーがなく、スキーマチェックでは最上位のmessageだけが翻訳され、details内のテキストは英語のままです。X-Request-Idヘッダーは常に設定されます。
主なコード
| HTTP | error | 意味 | 対処法 |
|---|---|---|---|
| 400 | invalid_json | 本文が有効なJSONではありません | JSONを確認してください |
| 400 | bad_request | Content-Typeが間違っているか、リクエストの形式が不正です | Content-Type: application/jsonを設定してください |
| 401 | missing_bearer_token | Authorizationヘッダーにトークンがありません | Authorization: Bearer …ヘッダーを設定してください |
| 401 | invalid_token | トークンが期限切れか無効、またはキーが削除されました | 新しいトークンを取得してください。解決しない場合はキーを確認してください |
| 401 | invalid_api_key | トークン交換でキーIDかシークレットが間違っています | 認証情報を確認してください |
| 402 | plan_limit_reached | 短縮リンクなどでプランの上限に達しました | アップグレードするか、項目を削除してください |
| 403 | insufficient_scope | スコープがないか、エンドポイントがAPIキーで使えません | 正しいスコープでキーを作成してください |
| 403 | forbidden | この操作の権限がありません | ダッシュボードで行ってください |
| 403 | feature_not_available | 機能がプランに含まれていません | プランを確認してください |
| 403 | block_type_requires_plan | ブロックの種類は上位のプランでのみ使えます | 別のブロックの種類を選ぶか、アップグレードしてください |
| 403 | template_locked | プレミアムテンプレートは現在のプランでは使えません | GET /v1/templates/availableからテンプレートを選んでください |
| 403 | workspace_suspended, workspace_read_only, workspace_grace_expired | 未払いのため、ワークスペースがロックされているか読み取り専用です | ダッシュボードで支払いを解決してください |
| 404 | not_found | リソースが存在しないか、ワークスペースに属していません | IDを確認してください |
| 409 | conflict | 現在の状態との一般的な競合です | 状態を読み込み直し、入力を変更してください |
| 409 | workspace_template_in_use | ワークスペーステンプレートがまだページで使われています。数はdetails.countにあります | ページを別のテンプレートに切り替えてから削除してください |
| 409 | handle_taken, slug_taken | ハンドルまたは短縮リンクのスラッグがすでに使われています | 別の値を選んでください |
| 409 | form_in_use, page_not_private, page_not_published, never_published | 状態との競合:フォームがまだページにある、ページが非公開でない、公開されていない、一度も公開されていない | 状態を変更してから再度お試しください |
| 409 | page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reached | プランの数量またはストレージの上限に達しました | 項目を削除するか、アップグレードしてください |
| 409 | draft_not_publishable | 下書きに問題があります。一覧はdetails.issuesにあります | 問題を修正してから再び公開してください |
| 413 | request_too_large | 本文がこのエンドポイントで許可される大きさ(64 KB、1 MB、2 MB)を超えています。上限はdetails.max_kbにあります | 1回のリクエストで送るデータを減らしてください。レート制限をご覧ください |
| 413 | payload_too_large | アップロードしたファイルが10 MBを超えています | ファイルを小さくしてください |
| 422 | validation_failed | 無効な入力または不明なフィールドです。詳細はdetailsにあります | detailsの説明に従ってフィールドを修正してください |
| 422 | handle_reserved, target_url_invalid, target_url_scheme, target_url_host | ハンドルが予約されているか、リンク先URLが無効または許可されていません | 別の値を選んでください |
| 422 | workspace_template_disabled | 選んだワークスペーステンプレートは無効になっています | 「ドメインとテンプレート」でテンプレートを有効にするか、別のものを選んでください |
| 422 | template_css_external, template_section_invalid | ワークスペーステンプレート:CSSが外部のサーバーから読み込んでいるか、{{#if}}/{{#unless}}/{{#each}}のセクションの位置が正しくありません | 外部のアドレスを削除するか、同じタグまたはテキストの中でセクションを閉じてください |
| 422 | custom_css_external | カスタムCSSが外部のサーバーから何かを読み込んでいます | CSSから外部のアドレスを削除してください |
| 429 | rate_limited, api_key_locked | リクエストが多すぎるか、失敗によりキーがロックされました | Retry-Afterまたはdetails.retry_after_secの時間だけ待ってください |
| 500 | internal_error | 予期しないエラーです | 後でもう一度お試しください。request_idを控えておいてください |
| 503 | service_unavailable | サービスが一時的に利用できません | 少し待ってから再度お試しください |
入力エラーの読み方
422 validation_failedでは、detailsにすべての問題が個別に一覧表示されます。fieldはフィールドのパス(ネストしたオブジェクトはスラッシュ区切り、例:theme_config/button_style)、reasonは違反したルール(required、minLength、maxLength、enum、additionalPropertiesなど)です。additionalPropertiesの場合、messageにどのフィールドが不明かが示されます。多くの場合、フィールド名の入力ミスです。
コードでの推奨される対応
- 400、413、422:再試行せず、リクエストを修正してください
- 401 invalid_token:新しいトークンを一度取得して再試行してください
- 403:再試行せず、スコープ、プラン、誰がこの操作をできるかを確認してください
- 404:IDを確認してください。削除後であれば正常です
- 409:状態を読み込み直し、その操作がまだ必要か判断してください
- 429:Retry-Afterの時間だけ待ってから再試行してください。レート制限をご覧ください
- 500と503:間隔を広げながら数回再試行してください
こちらもおすすめ
答えが見つかりませんか?
お困りのことをお知らせください。サポートチームが個別にお手伝いします。