メインコンテンツへスキップ

Documentation Index

Fetch the complete documentation index at: https://docs.waffo.ai/llms.txt

Use this file to discover all available pages before exploring further.

エラーフォーマット

すべてのエラーレスポンスは一貫した構造に従います。
{
  "data": null,
  "errors": [
    {
      "message": "Missing required field: name",
      "layer": "product"
    }
  ]
}

errors 配列の読み方

errors 配列は根本原因からトップレベルの呼び出し元の順に並んでいます。
  • errors[0] — 障害の根本原因(デバッグに最も有用)
  • errors[n] — エラーを表面化させたトップレベルの呼び出し元
ほとんどの場合、errors[0].message を確認するだけで対処可能なエラー説明を取得できます。

HTTP ステータスコード

コード意味説明
200成功リクエストが正常に処理されました
400Bad Request無効なパラメータまたは不正なリクエストボディ
401Unauthorized認証情報が欠落しているか無効です
403Forbidden認証情報は有効ですが、権限が不足しています
404Not Foundリクエストされたリソースが存在しません
409Conflict冪等リクエストが既に処理中です
429Rate Limited短期間にリクエストが多すぎます
500Server Error内部サーバーエラー
501Not Implementedリクエストされた機能はまだ利用できません
502Bad Gatewayアップストリームサービスエラー

エラーの layer フィールド

各エラーには、システムのどの部分がエラーを生成したかを示す layer 文字列が含まれます。デバッグ時に根本原因を特定するために、layer 値を message と合わせて使用してください。

よくあるエラーシナリオ

認証エラー (401)

{
  "data": null,
  "errors": [
    {
      "message": "Token has expired",
      "layer": "user"
    }
  ]
}
解決方法:
  • Merchant ID と秘密鍵が正しいことを確認してください
  • SDK が有効な認証情報で初期化されていることを確認してください
  • 秘密鍵が登録済みの公開鍵と一致することを確認してください

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

{
  "data": null,
  "errors": [
    {
      "message": "Store name must be between 1 and 100 characters",
      "layer": "store"
    }
  ]
}
解決方法:
  • 必須フィールドが存在することを確認してください
  • フィールド値のフォーマットと制約を確認してください
  • 金額が表示フォーマット文字列(例:"29.00")であることを確認してください

権限エラー (403)

{
  "data": null,
  "errors": [
    {
      "message": "Only store owner can delete store",
      "layer": "store"
    }
  ]
}
解決方法:
  • API Key が必要な権限を持っていることを確認してください
  • ユーザーが正しいストアに所属していることを確認してください

冪等性コンフリクト (409)

{
  "data": null,
  "errors": [
    {
      "message": "Request with this idempotency key is already being processed",
      "layer": "gateway"
    }
  ]
}
解決方法:
  • 元のリクエストの完了を待ってください
  • 新しいリクエストには別の X-Idempotency-Key を使用してください

コードでのエラー処理

TypeScript SDK

import { WaffoPancake, WaffoPancakeError } from "@waffo/pancake-ts";

const client = new WaffoPancake({
  merchantId: process.env.WAFFO_MERCHANT_ID!,
  privateKey: process.env.WAFFO_PRIVATE_KEY!,
});

try {
  const { store } = await client.stores.create({ name: "My Store" });
} catch (err) {
  if (err instanceof WaffoPancakeError) {
    const rootCause = err.errors[0];
    console.error(`Error [${rootCause.layer}]: ${rootCause.message}`);
    // err.status contains the HTTP status code
  }
}

リトライ戦略

以下のステータスコードに対して指数バックオフでリトライしてください。
  • 429 — レート制限(Retry-After ヘッダーがある場合はそれに従ってください)
  • 500 — 内部サーバーエラー
  • 502 — Bad Gateway
async function retryRequest(fn, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await fn();
    } catch (error) {
      const status = error.status;
      if (![429, 500, 502].includes(status) || attempt === maxRetries - 1) {
        throw error;
      }
      const delay = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s
      await new Promise(resolve => setTimeout(resolve, delay));
    }
  }
}
400401403404 エラーはリトライしないでください。これらはリクエスト自体の修正が必要な問題を示しています。

安全なリトライのための冪等性

X-Idempotency-Key ヘッダーを使用して、重複を作成せずに書き込み操作を安全にリトライできます。
curl -X POST https://api.waffo.ai/v1/actions/checkout/create-session \
  -H "Content-Type: application/json" \
  -H "X-Store-Slug: your-store-slug" \
  -H "X-Environment: test" \
  -H "X-Idempotency-Key: order-abc-123" \
  -d '{"productId": "...", "productType": "onetime", "currency": "USD"}'
  • 冪等キーは 24 時間 キャッシュされます
  • 同じキーを送信すると、キャッシュされたレスポンスが返されます
  • 元のリクエストがまだ処理中の場合は、409 Conflict が返されます