メインコンテンツへスキップ
このページは英語から翻訳されています。英語版が正式な情報源です。翻訳内容に不一致がある場合は、英語版を参照してください。

エラーハンドリング

Flex Forward APIは標準的なHTTPステータスコードと構造化されたエラーレスポンスを使用します。このページでは、エラー形式、ステータスコードの意味、障害処理のガイダンスについて説明します。

エラーレスポンス形式

API は障害の種類に応じて4つのエラーレスポンス形式を返します。どの形式が返されるかを理解することで、正確なエラー解析ロジックを記述できます。

標準エラー

未対応の配送業者/商品、認証エラー、競合、リソース未検出エラー、サーバーエラーなどの障害の場合に返されます。形式は { "error": string, "code"?: string } です:
error のテキストは参考情報であり、予告なく変更される場合があります。HTTPステータスコードと、存在する場合は code で分岐してください — メッセージ本文で分岐しないでください。 code フィールドは一部のエラーレスポンスに設定されます。IDEMPOTENCY_CONFLICT と DUPLICATE_CUSTOMER_ORDER_NUMBER はHTTP 409の競合を区別します。 code は任意で未知の値もあり得ます。コードがない場合はHTTPステータスで処理してください。

バリデーションエラー

リクエストのバリデーション失敗(HTTP 400)の場合に返されます。フィールドレベルのエラー情報を含む details 配列が含まれます:
details の各エントリには以下が含まれます: 最初のバリデーションエラーのみが返されます。修正して再送信すると、次のエラーが表示されます。 HTTP 400では標準エラー形状が使われることもあります(例:配送業者や商品が未対応の場合)。読み取る前に details が存在するかを確認してください。すべての400にフィールドレベルのエラーが含まれるとは限りません。

HTTPステータスコード

ラベル作成結果の読み方

POST /labels は 200、201、502 のいずれでも同じ LabelResponse 形式を返します。HTTPステータスコードは、この呼び出しでラベルを作成したのか、以前の試行をリプレイしたのか、配送業者に拒否されたのかを示します。ラベルが存在するかどうかは status フィールドが示します。
POST /labels では、HTTPステータスコードではなく status フィールドで分岐してください。冪等リプレイは最初の試行が配送業者で失敗していてもHTTP 200を返すため、200レスポンスに status: failed が含まれることがあります。

バリデーションエラー(400)

スキーマバリデーションエラーは、リクエストボディがAPIの要件を満たしていないことを示し、特定のフィールドパスを含む details 配列が含まれます。その他のHTTP 400エラーは、details を含まない標準エラー形状を使用します。 一般的な原因:
  • 必須フィールドの欠落(shipment.shipTo、courier、idempotencyKey)
  • フィールドの型または長さが不正(例:countryCode は正確に2文字である必要があります)
  • 数値が負の値(weight と寸法は負の値であってはなりません)
  • 無効な order.customerOrderNumber(最大40文字、ASCII英字、数字、-、_ のみ使用可能)
  • 未対応の label.format(PDF または PNG を使用)、または商品の unitPrice.currency(USD のみ受け付け)
リトライする前に、報告されたエラーを修正してください。ラベルが作成されていないため、400レスポンス後も同じ idempotencyKey を再利用できます。

認証エラー(401 / 403)

401 Unauthorized

x-rr-apikey または x-rr-apitoken ヘッダーが欠落または無効の場合:
両方のヘッダーが存在することを確認してください:

403 Forbidden

認証情報は有効ですが、アカウントがAPIの呼び出しを許可されていない場合です(例:ブロックされたアカウント):
別のアカウントに属するラベルまたは追跡レコードは、403ではなく404を返します。

配送業者の下流エラー 502 と 422

POST /labels の実行中に配送業者サービスがエラーを返した場合、APIはHTTP 502で応答します。ラベルはデータベースに status: failed で保存され、配送業者のエラー詳細が含まれます:
error オブジェクトには以下が含まれます:
502レスポンスは、ラベルリクエストが配送業者に到達し、拒否されたことを意味します。リトライする前にエラーメッセージを確認してください — 一部の配送業者エラー(住所バリデーションなど)は一時的なものではなく、リクエストの変更が必要です。
失敗したラベルに対してその後 GET /labels/{id} または GET /tracking/{id} を呼び出すと、HTTP 422 で LabelFailedResponse ボディが返されます — そのラベルの文書や追跡情報は利用できません:

リトライ可能なエラーと不可能なエラー

推奨されるリトライ戦略については冪等性とリトライをご覧ください。

トラブルシューティング

すべてのPOSTリクエストには Content-Type: application/json を含める必要があります。これがないとリクエストボディが解析されず、APIは400エラーを返します。
すべてのリクエストはHTTPSを使用する必要があります。正しい環境URLを使用していることを確認してください:https://api.flexforwardship.com(本番)または https://sandbox.flexforwardship.com(開発)。
GET /labels/{id} と GET /tracking/{id} の id パラメーターは、ラベルのUUIDまたは customerOrderNumber を受け付けます。それ以外の値、または他のアカウントの識別子を渡すと404エラーが返されます。
status: failed のレスポンスは POST /labels からHTTP 502で(または同じ idempotencyKey でリプレイした場合はHTTP 200で)返され、そのラベルをその後読み取るとHTTP 422が返されます。配送業者のエラーメッセージについては error オブジェクト(読み取り時は LabelFailedResponse ボディ)を確認してください。一般的な原因:無効な住所、サポートされていない配送先、または配送業者アカウントの設定の問題。