APIFuseAPIFuse
  • Providers
  • 変更履歴
  • Playground
  • ダッシュボード
  • APIFuse ドキュメント
    • はじめに
    • 認証と Connection
    • Playground
    • OpenAPI と schema
    • MCP エンドポイント
    • Developer MCP ガイド
    • スキーマバンドル
    • Next.js App Router 連携
    • FastAPI 連携
    • エラーハンドリング
    • FAQ
    • リソース
APIFuseAPIFuse

エラーハンドリング

APIFuse のエラーレスポンスを読み、リトライすべき失敗とアップストリームサービスが拒否したリクエストを見分ける方法。

エラーハンドリング

APIFuse のすべてのエラーレスポンスは 3 つのことを伝えます: 何が起きたか(code、message)、誰がリクエストを止めたか(source)、同一リトライが成功し得るか(retryable)。HTTP ステータスコードのパターンマッチではなく、これらのフィールドを使ってください。

エラーレスポンスの形

{
  "error": {
    "code": "UPSTREAM_REJECTED",
    "message": "The requested time slot overlaps an existing reservation.",
    "retryable": false,
    "source": "upstream_rule",
    "fix": "Pick a slot that does not overlap the account's existing reservations.",
    "requestId": "req_1a2b3c"
  }
}
フィールド意味
code安定した機械可読コード。オペレーション固有のコードは各オペレーションのリファレンスページに記載されます。
message人間向けの要約。
retryablefalse の場合、同一リトライは成功しません — リクエストを変更してください。true の場合、後でリトライすれば成功する可能性があります。
source誰がリクエストを止めたか(下記参照)。
fixリクエストを成功させるために変更すべき点(判明している場合)。
requestIdサポートに問い合わせる際に添えてください。

source と retryable を省略するエラーレスポンスもあります。無い場合は下記のステータスクラスで判断してください。

プラットフォームレベルのエラー(不正な Connection ID、相手サービスへの接続タイムアウト、キャンセルされたリクエスト)は、同じフィールドをトップレベルに持つフラットな body を使います: {"error", "code", "message", "action", "retryable", "source", "request_id"}。公式 SDK は両方の形を読み取ります。

誰がリクエストを止めたか

source意味対応
clientリクエスト自体の変更が必要(不正な入力、存在しない/期限切れの Connection)。リクエストを修正するか再接続してから呼び直してください。
upstream_rule相手サービスがリクエストを理解した上で、自身のルールにより拒否 — 売り切れ、重複する予約、アカウント状態の制限など。理由をユーザーに提示するか、リクエストを変更してください。同一リトライは同じ結果になります。
upstream_failure相手サービスの障害または無応答。バックオフを入れてリトライしてください。
apifuseAPIFuse がリクエストを完了できませんでした。バックオフを入れてリトライし、続く場合は requestId を添えてサポートへ。

ステータスクラス

ステータス分類典型的な source
400, 401, 404リクエストの変更が必要client
409, 410, 422相手サービスが自身のルールで拒否upstream_rule
429レート制限 — Retry-After に従うupstream_rule
502, 504アップストリームの障害またはタイムアウトupstream_failure
500, 503APIFuse 側の障害apifuse

409 は障害ではありません: 相手サービスは正常で、確定的な回答を返しています。リトライすべきエラーではなく、アプリケーションデータとして扱ってください(例:「この時間帯は既に予約済みです」と表示)。

安全なリトライ

  • retryable: false のレスポンスは決して自動リトライしないでください。
  • 429 は Retry-After の間隔後に、502/503/504 は指数バックオフでリトライしてください。
  • 公式 TypeScript / Python SDK はこれらのルールに自動で従い、スローされたエラーで error.retryable と error.source を参照できます。
import { ApiFuseClient, ApiFuseError } from "@apifuse/sdk";

const client = new ApiFuseClient({ apiKey: process.env.APIFUSE_API_KEY! });

async function reserve(input: Record<string, unknown>) {
  try {
    return await client.call.invoke("catchtable", "reserve", input);
  } catch (error) {
    if (
      error instanceof ApiFuseError &&
      error.source === "upstream_rule" &&
      error.retryable === false
    ) {
      // 確定的な拒否 — リトライせずユーザーに理由を提示してください。
      // (429 レート制限も source は "upstream_rule" ですが retryable の
      // ため、上のガードがリトライ経路に残します。)
      return { refused: true, reason: error.message, suggestion: error.fix };
    }
    throw error;
  }
}

On this page

エラーハンドリングエラーレスポンスの形誰がリクエストを止めたかステータスクラス安全なリトライ
APIFuseAPIFuse
  • Providers
  • 変更履歴
  • Playground
  • ダッシュボード
  • APIFuse ドキュメント
    • はじめに
    • 認証と Connection
    • Playground
    • OpenAPI と schema
    • MCP エンドポイント
    • Developer MCP ガイド
    • スキーマバンドル
    • Next.js App Router 連携
    • FastAPI 連携
    • エラーハンドリング
    • FAQ
    • リソース
Providers
  • API Reference
    • Amazon Japan
    • Baeminプロバイダー
    • Buyee
    • CatchTable
    • Charan Commerce
    • Daangn (Karrot)
    • Daiso 商品・店舗データ
    • Danawa 価格比較
    • Demaecan
    • 駅探
    • Goodchoice(ヨギオッテ)韓国国内宿泊
    • Google Flights
    • 漢江水位
    • ホットペッパーグルメ
    • Hyundai Card
    • Jalan
    • Japan National Diet Minutes
    • Japan Disaster Alerts
    • 日本 EDINET 開示書類
    • e-Gov法令検索
    • Japan e-Stat
    • Japan GSI Geocoding
    • Japan e-Gov Open Data
    • Japan Post ZIP
    • 日本の祝日
    • JMA Weather
    • KakaoMap
    • Kakao T タクシー配車
    • Korea Address Search
    • AirKorea 空気質
    • Korea Apartment Rent Prices
    • Korea Apartment Sale Prices
    • Korea Bid Notices
    • Korea Building Register
    • Korea Business Verify
    • Korea Camping
    • Korea DART Corporate Finance
    • DART Corporate Info
    • Korea Culture Events
    • Korea Disaster Alert
    • Korea Emergency Hospital
    • Korea ETF
    • Korea EV Charger
    • Korea Fuel Price
    • Korea Holiday
    • Korea Hospital Info
    • Korea Land Price
    • 医薬品安全情報
    • 食品安全情報
    • 生活廃棄物排出案内
    • 国家法令情報
    • 学校給食
    • 宅配追跡
    • Korea Pharmacy
    • Korea Population
    • Korea Stock Index
    • Korea Stock Price
    • Korea Train Schedule
    • KMA 天気予報
    • Korea Weather Forecast
    • Korea Welfare Service
    • K-Startup
    • LH 住宅公告
    • Market Kurly
    • Mercari
    • モドゥ駐車場(Modu Parking)
    • Naver Blog 検索
    • Naver Flight
    • Naver Map
    • Naver News 検索
    • NOL 宿泊施設
    • Ohouse
    • Rakuten Ichiba
    • Rakuten Travel
    • SEC EDGAR Filings
    • ソウル公共自転車
    • ソウル混雑度
    • ソウル地下鉄到着情報
    • Shinhan Bank
    • Shinhan Card
    • Skiplagged
    • SUUMO
    • Swing Taxi
    • Tabelog
    • TableCheck
    • Weverse プロバイダー
    • Yahoo!ショッピング(日本)
    • Yogiyo
    • ZOZOTOWN
APIFuseAPIFuse

エラーハンドリング

APIFuse のエラーレスポンスを読み、リトライすべき失敗とアップストリームサービスが拒否したリクエストを見分ける方法。

エラーハンドリング

APIFuse のすべてのエラーレスポンスは 3 つのことを伝えます: 何が起きたか(code、message)、誰がリクエストを止めたか(source)、同一リトライが成功し得るか(retryable)。HTTP ステータスコードのパターンマッチではなく、これらのフィールドを使ってください。

エラーレスポンスの形

{
  "error": {
    "code": "UPSTREAM_REJECTED",
    "message": "The requested time slot overlaps an existing reservation.",
    "retryable": false,
    "source": "upstream_rule",
    "fix": "Pick a slot that does not overlap the account's existing reservations.",
    "requestId": "req_1a2b3c"
  }
}
フィールド意味
code安定した機械可読コード。オペレーション固有のコードは各オペレーションのリファレンスページに記載されます。
message人間向けの要約。
retryablefalse の場合、同一リトライは成功しません — リクエストを変更してください。true の場合、後でリトライすれば成功する可能性があります。
source誰がリクエストを止めたか(下記参照)。
fixリクエストを成功させるために変更すべき点(判明している場合)。
requestIdサポートに問い合わせる際に添えてください。

source と retryable を省略するエラーレスポンスもあります。無い場合は下記のステータスクラスで判断してください。

プラットフォームレベルのエラー(不正な Connection ID、相手サービスへの接続タイムアウト、キャンセルされたリクエスト)は、同じフィールドをトップレベルに持つフラットな body を使います: {"error", "code", "message", "action", "retryable", "source", "request_id"}。公式 SDK は両方の形を読み取ります。

誰がリクエストを止めたか

source意味対応
clientリクエスト自体の変更が必要(不正な入力、存在しない/期限切れの Connection)。リクエストを修正するか再接続してから呼び直してください。
upstream_rule相手サービスがリクエストを理解した上で、自身のルールにより拒否 — 売り切れ、重複する予約、アカウント状態の制限など。理由をユーザーに提示するか、リクエストを変更してください。同一リトライは同じ結果になります。
upstream_failure相手サービスの障害または無応答。バックオフを入れてリトライしてください。
apifuseAPIFuse がリクエストを完了できませんでした。バックオフを入れてリトライし、続く場合は requestId を添えてサポートへ。

ステータスクラス

ステータス分類典型的な source
400, 401, 404リクエストの変更が必要client
409, 410, 422相手サービスが自身のルールで拒否upstream_rule
429レート制限 — Retry-After に従うupstream_rule
502, 504アップストリームの障害またはタイムアウトupstream_failure
500, 503APIFuse 側の障害apifuse

409 は障害ではありません: 相手サービスは正常で、確定的な回答を返しています。リトライすべきエラーではなく、アプリケーションデータとして扱ってください(例:「この時間帯は既に予約済みです」と表示)。

安全なリトライ

  • retryable: false のレスポンスは決して自動リトライしないでください。
  • 429 は Retry-After の間隔後に、502/503/504 は指数バックオフでリトライしてください。
  • 公式 TypeScript / Python SDK はこれらのルールに自動で従い、スローされたエラーで error.retryable と error.source を参照できます。
import { ApiFuseClient, ApiFuseError } from "@apifuse/sdk";

const client = new ApiFuseClient({ apiKey: process.env.APIFUSE_API_KEY! });

async function reserve(input: Record<string, unknown>) {
  try {
    return await client.call.invoke("catchtable", "reserve", input);
  } catch (error) {
    if (
      error instanceof ApiFuseError &&
      error.source === "upstream_rule" &&
      error.retryable === false
    ) {
      // 確定的な拒否 — リトライせずユーザーに理由を提示してください。
      // (429 レート制限も source は "upstream_rule" ですが retryable の
      // ため、上のガードがリトライ経路に残します。)
      return { refused: true, reason: error.message, suggestion: error.fix };
    }
    throw error;
  }
}

On this page

エラーハンドリングエラーレスポンスの形誰がリクエストを止めたかステータスクラス安全なリトライ