APPD
← Protocols

x402 Protocol Guide

x402は、長年休眠状態だったHTTP 402「Payment Required」ステータスコードを活用し、ブロックチェーンベースの直接決済をHTTP上で実現するオープンなインターネットネイティブ決済標準です。

決済フロー

6ステップで完結する決済ライフサイクル

1

HTTPリクエスト

クライアント

ブラウザまたはAIエージェントがAPIリクエストを送信

2

402 Payment Required

サーバー

サーバーがPAYMENT-REQUIREDヘッダーで価格・通貨・ネットワーク・受取アドレスを返却

3

決済ペイロード生成

クライアント

クライアントがEIP-3009署名付き決済ペイロードを生成し、X-PAYMENTヘッダーで再送信

4

決済検証

ファシリテーター

ファシリテーターが署名・金額・アドレス・残高を検証(約100ms)

5

オンチェーン決済

ブロックチェーン

ファシリテーターがトランザクションを送信(Baseで約2秒のファイナリティ)

6

リソース配信

サーバー

サーバーが200 OKとPAYMENT-RESPONSEヘッダー(トランザクション確認)を返却


HTTPヘッダー仕様

x402プロトコルで使用される3つの主要ヘッダー

PAYMENT-REQUIREDStep 2

サーバーが返す402レスポンスに含まれる。スキーム、ネットワーク、金額、受取アドレス、リソース情報をBase64エンコードしたJSON。

{
  "x402Version": 1,
  "accepts": [{
    "scheme": "exact",
    "network": "base-sepolia",
    "maxAmountRequired": "1000",
    "resource": "https://api.example.com/data",
    "description": "API access fee",
    "mimeType": "application/json",
    "payTo": "0x1234...abcd",
    "extra": {
      "name": "USDC",
      "version": "2"
    }
  }]
}
X-PAYMENTStep 3

クライアントが再送信時に付与。x402バージョン、スキーム、ネットワーク、EIP-3009認可情報(署名、from/toアドレス、金額、有効期限、nonce)を含む。

{
  "x402Version": 1,
  "scheme": "exact",
  "network": "base-sepolia",
  "payload": {
    "signature": "0xabc1234...",
    "authorization": {
      "from": "0xBuyer...",
      "to": "0xSeller...",
      "value": "1000",
      "validAfter": "0",
      "validBefore": "1700000000",
      "nonce": "0x..."
    }
  }
}
PAYMENT-RESPONSEStep 6

サーバーが成功時に返却。決済ステータスとトランザクションハッシュを含む。

{
  "x402Version": 1,
  "scheme": "exact",
  "network": "base-sepolia",
  "payload": {
    "success": true,
    "transactionHash": "0xtxhash..."
  }
}

EIP-3009: Transfer With Authorization

x402はEIP-3009を活用し、ガスレスのUSDC送金を実現します。

ユーザーはUSDCのみ保持すればよく、ETH/SOLは不要

署名はオフチェーンで生成 — ガスコスト不要

validBefore/validAfterパラメータで署名の有効期限を制御

ユニークなnonceによりリプレイ攻撃を防止

Solidity Interface

// EIP-3009: Transfer With Authorization
function transferWithAuthorization(
  address from,
  address to,
  uint256 value,
  uint256 validAfter,
  uint256 validBefore,
  bytes32 nonce,
  uint8 v, bytes32 r, bytes32 s
) external;