{
  "lang": "ja",
  "ページ": "https://x402-catalog-history.ai-business-surface.workers.dev/ja/x402-payment-not-delivering",
  "title": "x402 payment not delivering — 届かないとき、402 は何を宣言しているか（実測）",
  "h1": "x402 payment not delivering を実測する — 支払い後に届かないとき、402 から読めるもの",
  "description": "x402 payment not delivering（支払ったのに納品されない）ときに、402 の宣言から何が分かるかを実測しました。2026-10-19 に無料サンプル /failure/sample を叩くと 200・3,184 B・153〜648 ms で、当方の /gas の 402 は error_shape・retry・refund の3項目を宣言せず、timeout（maxTimeoutSeconds=60）だけを宣言していました。未払いの /failure は 402・25,673 B・0.05 USDC・payment-required ヘッダ 5,336 B、/check は 402・26,993 B・0.05 USDC です。納品記録の /status は 39 経路中 26 経路が納品0件で、失敗は記録していません（fail_24h は常に null）。",
  "検索語": "x402 payment not delivering",
  "読者の問い": "x402 で支払ったのに納品されないとき、402 を読めば何が分かるのか。返金や再試行は宣言されているのか。届かなかったことを後から確かめられるのか。",
  "実測日": "2026-10-19 JST",
  "実測": {
    "caption": "失敗時の宣言を読む経路の実測（2026-10-19 JST・公開URL・支払いなしGET）",
    "columns": [
      "経路",
      "条件",
      "応答",
      "本文",
      "応答時間"
    ],
    "rows": [
      [
        "/failure/sample",
        "無料",
        "200",
        "3,184 B",
        "648 / 163 / 153 ms"
      ],
      [
        "/failure?url=…/gas",
        "未払い",
        "402",
        "25,673 B",
        "262 / 490 / 167 ms"
      ],
      [
        "/check?url=example.com/x",
        "未払い",
        "402",
        "26,993 B",
        "282 / 217 / 186 ms"
      ],
      [
        "/status",
        "無料",
        "200",
        "19,807 B",
        "8,433 ms"
      ],
      [
        "/openapi.json",
        "無料",
        "200",
        "141,345 B",
        "426 ms"
      ],
      [
        "/ja",
        "無料",
        "200",
        "58,174 B",
        "176 / 192 / 180 ms"
      ]
    ],
    "note": "402 の /failure は 0.05 USDC で、payment-required ヘッダは 5,336 B。同じ 0.05 USDC の /check は 402・26,993 B・ヘッダ 5,664 B でした。/failure/sample は無料で、当方の /gas の 402 を自己 fetch なしで読みます（応答の fetched_at は 2026-10-18T21:15:04.504Z、sha256 の先頭16桁は 3b9ff159a2e70f32）。/status の 19,807 B と 8,433 ms は1回だけの計測です。"
  },
  "見出し": [
    "結論",
    "実測",
    "402 が宣言していたもの・していなかったもの",
    "納品記録から分かること・分からないこと",
    "届かないときに、どこを見るか",
    "未確認と次の一歩"
  ],
  "本文": [
    {
      "見出し": "結論",
      "html": "<p>x402 で支払ったのに届かないとき、<strong>402 から分かるのは「売り手が失敗時の扱いを宣言したか」だけ</strong>です。実際に当方の <code>/gas</code> の 402 を無料の <code>/failure/sample</code> で読むと、4項目のうち宣言があったのは <strong>timeout 1つだけ</strong>（<code>maxTimeoutSeconds=60</code>）で、<strong>error_shape・retry・refund は未宣言</strong>、<code>missing[]</code> に3項目が入っていました。返金の約束も再試行の条件も、402 には書かれていません。</p><p>これは「返金しない」という意味ではありません。<strong>宣言が無いので、402 からは返金の有無を読めない</strong>という意味です。未宣言を「無い」と読み替えないのがこの道具の設計で、<code>missing[]</code> がその差を残します。</p><p>納品されたかどうかも、売り手の <code>/status</code> だけでは分かりません。当方の実測では <strong>39 経路中 26 経路が納品0件</strong>でしたが、これは「失敗した」ではなく <code>no_data</code>（記録が無い）です。納品ログは 200 の納品だけを記録し、<code>fail_24h</code> は常に <code>null</code> です。<strong>届かなかったことの証拠は、自分の支払いトランザクションと売り手の記録を突き合わせるまで確定しません。</strong></p>"
    },
    {
      "見出し": "実測",
      "html": "<table>\n<thead><tr><th>経路</th><th>条件</th><th>応答</th><th>本文</th><th>応答時間</th></tr></thead>\n<tbody>\n<tr><td><code>/failure/sample</code></td><td>無料</td><td>200</td><td>3,184 B</td><td>648 / 163 / 153 ms</td></tr>\n<tr><td><code>/failure?url=…/gas</code></td><td>未払い</td><td>402</td><td>25,673 B</td><td>262 / 490 / 167 ms</td></tr>\n<tr><td><code>/check?url=example.com/x</code></td><td>未払い</td><td>402</td><td>26,993 B</td><td>282 / 217 / 186 ms</td></tr>\n<tr><td><code>/status</code></td><td>無料</td><td>200</td><td>19,807 B</td><td>8,433 ms</td></tr>\n<tr><td><code>/openapi.json</code></td><td>無料</td><td>200</td><td>141,345 B</td><td>426 ms</td></tr>\n<tr><td><code>/ja</code></td><td>無料</td><td>200</td><td>58,174 B</td><td>176 / 192 / 180 ms</td></tr>\n</tbody>\n</table>\n<p><code>/failure</code> は <strong>0.05 USDC</strong> で、未払いの GET には 402 と <code>payment-required</code> ヘッダ <strong>5,336 B</strong> を返します。同じ 0.05 USDC の <code>/check</code> は 402・<strong>26,993 B</strong>・ヘッダ <strong>5,664 B</strong> でした。402 本文の大きさは価格では決まらず、対象や説明の量で変わります。</p><p>支払わずに読める <code>/failure/sample</code> は <strong>200・3,184 B</strong> で、初回 648 ms、2回目 163 ms、3回目 153 ms。ウォーム後は <strong>153〜163 ms</strong> です。同じ時刻の <code>/openapi.json</code> は 48 paths を含む <strong>141,345 B</strong>・426 ms で、<code>/failure</code> と <code>/failure/sample</code> の両方が載っています。</p><p><code>/status</code> だけが <strong>8,433 ms</strong> と大きく遅い結果でした。1回だけの計測で、原因は<strong>未確認</strong>です。</p>"
    },
    {
      "見出し": "402 が宣言していたもの・していなかったもの",
      "html": "<p><code>/failure/sample</code> が読んだのは、当方の <code>/gas</code> の 402（<code>PAYMENT-REQUIRED</code> ヘッダの base64 JSON を優先）です。返ってきた宣言は次の4項目に分かれます。</p>\n<table>\n<thead><tr><th>項目</th><th>宣言</th><th>読めた内容</th></tr></thead>\n<tbody>\n<tr><td><code>error_shape</code></td><td><strong>false</strong></td><td>フィールド0件・必須0件。失敗時に何が返るかの形は書かれていない</td></tr>\n<tr><td><code>timeout</code></td><td><strong>true</strong></td><td><code>accepts[0].maxTimeoutSeconds</code> = <strong>60</strong>（支払いの期限であって、応答の期限ではない）</td></tr>\n<tr><td><code>retry</code></td><td><strong>false</strong></td><td>再試行の文言もキーも無い</td></tr>\n<tr><td><code>refund</code></td><td><strong>false</strong></td><td>返金の文言もキーも無い</td></tr>\n</tbody>\n</table>\n<p><code>missing[]</code> は <strong>[\"error_shape\", \"retry\", \"refund\"]</strong> の3件。<code>x402Version</code> は <strong>2</strong>、<code>declared</code> は <strong>true</strong>（402 自体は読めた）です。つまり<strong>「x402 であることは読めるが、失敗した後のことは読めない」</strong>という状態です。</p><p>ここで注意が2つあります。1つ目は、<code>declared:false</code> は<strong>「返金しない」ではない</strong>こと。宣言が無いだけで、売り手が別のページや規約で返金を約束している可能性は残ります。2つ目は、<code>maxTimeoutSeconds</code> は<strong>支払いの期限</strong>で、応答が60秒で切れるという意味ではないこと。この道具はそこを読み替えず、<code>timeout</code> の note にもそう書いています。</p><p><code>/failure?url=…</code> は、この4項目を<strong>他人の 402 についても</strong>読む有料の経路です（0.05 USDC・1回の GET）。対象の 402 を1回だけ読み、推測はせず、読めたパスだけを返します。今回は支払っていないので、200 の本文は<strong>未取得</strong>です。</p>"
    },
    {
      "見出し": "納品記録から分かること・分からないこと",
      "html": "<p>「届かなかった」を確かめる材料として、無料の <code>/status</code>（19,807 B）を同じ時刻に読みました。全体は <strong>39 経路</strong>で、<code>routes_with_data</code> は <strong>13</strong>、納品記録がある経路の合計は <strong>60 件</strong>。残る <strong>26 経路は納品0件</strong>で、<code>data_status</code> は <code>no_data</code> でした。</p>\n<p>納品が多い順は <code>/history</code> 26件、<code>/price</code> 7件、<code>/gas</code> 6件、<code>/check</code> 5件、<code>/reality</code> 4件。<code>overall.last_success</code> は <strong>2026-10-18T03:00:46.740Z</strong>、<code>success_24h</code> は <strong>5</strong> です。</p>\n<p>ただし、これは<strong>失敗率ではありません</strong>。<code>/status</code> が記録するのは「有効な支払いの後に 200 を返した納品」だけで、<code>fail_24h</code> は常に <code>null</code>（データが無い、0ではない）です。26 経路の納品0件も、買われなかったのか、買われたが届かなかったのか、この記録だけでは区別できません。<strong>「記録が無い」を「死んでいる」と読み替えない</strong>のがこの面の設計です。</p><p>同じ <code>/status</code> が 8,433 ms かかったことも、失敗の証拠にはなりません。1回の計測で、遅い理由は未確認です。</p>"
    },
    {
      "見出し": "届かないときに、どこを見るか",
      "html": "<ol>\n<li><strong>払う前に 402 を読む。</strong><code>error_shape</code>・<code>retry</code>・<code>refund</code> が宣言されているか、<code>missing[]</code> に何が入るかを見ます。当方の <code>/gas</code> は timeout 以外が未宣言でした。未宣言なら<strong>返金の約束は 402 には無い</strong>と扱い、払う金額を1回分に抑えます。</li>\n<li><strong>無料サンプルで形を先に読む。</strong><code>/failure/sample</code> は 200・3,184 B・153〜163 ms（ウォーム時）で、同じ形を無料で返します。有料の <code>/failure</code> を買う前に、返る項目と <code>missing[]</code> の読み方を確認できます。</li>\n<li><strong>払った後に納品記録を見る。</strong>売り手の <code>/status</code> で、その経路に <code>last_success</code> と <code>deliveries_observed</code> があるかを見ます。無ければ <code>no_data</code> であって、失敗の証明ではありません。自分の支払いトランザクションの時刻と、売り手側の記録の時刻を並べます。</li>\n<li><strong>返金を前提にしない。</strong>当方の 402 には返金の宣言がありません。x402 の支払いはオンチェーンで、返金は自動ではありません。<strong>1回ごとに小さく買い、200 の形を確かめてから繰り返す</strong>のが安全です。</li>\n</ol>\n<p>当方の <code>/failure</code> は <strong>0.05 USDC</strong> で存在しますが、facilitator の <code>listing-status</code> は <strong>404</strong>（カタログ未掲載）でした（<code>/failure/sample</code> も 404）。カタログから辿る買い手には見つからないので、この記事と <code>/openapi.json</code> が入口になります。掲載状況は2026-10-19時点の実測です。</p>"
    },
    {
      "見出し": "未確認と次の一歩",
      "html": "<p><strong>200 の本文は取得していません</strong>（支払い・SMS・KYC は行わない制約）。したがって、<code>/failure</code> を買ったときに返る実際の JSON、他人の 402 に対する判定の精度、<code>retry</code> や <code>refund</code> が宣言されている売り手の実例は<strong>未確認</strong>です。数字はすべて「402 が返るところ、無料の 200 が返るところ」までの実測です。</p><p><code>/status</code> の 8,433 ms がコールドスタートか負荷かは特定していません。26 経路の納品0件も、未購入と未納品のどちらかは分かりません。</p><p>買う前の確認手順は <a href=\"https://x402-catalog-history.ai-business-surface.workers.dev/ja/check-before-paying\"><code>/ja/check-before-paying</code></a>、相手の仕様変更は <a href=\"https://x402-catalog-history.ai-business-surface.workers.dev/ja/schema-change\"><code>/ja/schema-change</code></a>、価格の相場は <a href=\"https://x402-catalog-history.ai-business-surface.workers.dev/ja/price-benchmark\"><code>/ja/price-benchmark</code></a> に実測でまとめています。API の形は無料の <a href=\"https://x402-catalog-history.ai-business-surface.workers.dev/openapi.json\"><code>/openapi.json</code></a>（48 paths）で読めます。</p>"
    }
  ],
  "一覧": "https://x402-catalog-history.ai-business-surface.workers.dev/ja"
}
