AIエージェントが1コール$1.00 USDCで叩くAML APIをCoinbase x402 Bazaarに出した話
2026-04-28、ChainAnalyzerは Coinbase x402 Bazaar 上で初の本番mainnet settlementを成立させました。AIエージェントが $1.00 USDC をBase上で自律支払いし、Tornado Cashのアドレスに対して 76+ ルール × ML × Neo4jグラフを走らせた結果、CRITICALリスク・64件の検知を30秒以内に取得しました。アカウント不要、APIキー不要、すべてon-chainでsettle済み。
ハイライト
- x402 v2 spec完全準拠 — verify + settleの両方が実mainnetで稼働。EIP-3009
transferWithAuthorization+ Coinbase CDP facilitator経由 - Coinbase Bazaar自動indexing — submission不要、最初のsuccessful settlementがcatalog作成のトリガー
- Tornado CashデモでCRITICAL判定 — 64件の検知(Address Poisoning, Peel Chain, Fake Token URL Phishing, Sybil Aggregation, Token Relay)
- 9チェーン横断 — Bitcoin, Ethereum, Polygon, Arbitrum, Optimism, Base, Avalanche, Solana。Bitcoin対応は本領域では珍しい
- サブスク不要 — AIエージェントはUSDCを持っていれば
fetch()1行でAMLスキャンを呼べる
なぜx402がAIエージェント時代に効くのか
既存のAPIビジネスモデルは「アカウント作成 → APIキー発行 → サブスク決済」の3段階を前提にしています。AIエージェントにとってこれは致命的な摩擦です — エージェントは自律的に意思決定したいのに、人間がアカウントを作りキーを発行する間、行動できない。
x402 はHTTP 402 (Payment Required)を「実際に動く」状態にするプロトコルです。サーバーは支払い要件を402レスポンスで返し、クライアントはUSDC署名を X-PAYMENT ヘッダに付けて再リクエスト。CoinbaseのCDP facilitatorがverify + settleをon-chainで実行し、サーバーは支払い確定後にレスポンスを返します。
結果として、ウォレットを持つAIエージェントはChainAnalyzerのAML機能をその場で1リクエスト単位で利用可能です。サブスク契約もAPIキー管理も不要。Coinbase Bazaar / Agentic.Market はこの仕組みでカタログ化されたAPIをAIエージェントが発見・比較・呼び出しするマーケットプレイスです。
実装で躓いた5箇所
x402 v2 specは新しく、自前で書こうとすると複数の落とし穴があります。実際にハマって直した箇所を共有します。
1. Verifyのwire formatが完全に違う
最初の自前実装は {"payment": "<base64>", "requirements": {scheme, price}} をfacilitatorにPOSTしていました。これはv2 specとは何の関係もない形です。正しい形は次の通り:
{
"x402Version": 2,
"paymentPayload": {
"x402Version": 2,
"payload": { "signature": "0x...", "authorization": { ... } },
"accepted": {
"scheme": "exact",
"network": "eip155:8453",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "8000",
"payTo": "0xe8e26183...708959",
"maxTimeoutSeconds": 60,
"extra": { "name": "USD Coin", "version": "2" }
},
"resource": { "url": "...", "description": "...", "mimeType": "application/json" }
},
"paymentRequirements": {
"scheme": "exact",
"network": "eip155:8453",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "8000",
"payTo": "0xe8e26183...708959",
"maxTimeoutSeconds": 60
}
} キモは paymentPayload.accepted — クライアントが「自分はこの要件にコミットして署名した」というエコーバック。これがないとfacilitatorは署名をnetwork / asset / payToに紐付けて検証できません。
2. Settle関数が実装されていなかった
Verifyは「署名が正しいか」を確認するだけで、USDCを実際に動かすのは /settle エンドポイントへの2度目のPOSTです。最初の実装はverifyだけ呼んで「成功」とみなしていたため、USDCは一切移動していない状態でAPIレスポンスを返していました。Coinbase公式 x402 Pythonライブラリの HTTPFacilitatorClient に置き換え、verify → handler → settleの3段フローに修正。
3. SvelteKitプロキシがX-PAYMENTヘッダを落としていた
フロントから /api/v1/x402/... に投げるとHTTP 402が永久に返ってきました。原因はSvelteKit catch-all proxyが X-API-Key と Content-Type しかforwardしていなかったこと。X-PAYMENT と PAYMENT-SIGNATURE をforwardするよう明示追加が必要。
4. esm.shのtransitive dep地獄
最初はブラウザ デモで x402-fetch をesm.shからCDNロードしようとしましたが、x402-fetch@1.2.0 は内部で @solana/rpc-parsed-types@5.5.1 をimportしていて、そのサブパスがesm.shに存在せずtext/plain 404を返してきます。Firefoxは「MIME type not allowed」と表示。解決策はviemの signTypedData_v4 だけでEIP-3009を自前署名すること — 50行で済みました。
5. Self-transfer (from == payTo)でfacilitatorが黙ってreject
最初のテストでPhantomがtreasuryと同じウォレットに繋がっていて、transferWithAuthorization(from=A, to=A, value=8000) を署名していました。Facilitatorは「technically正しい署名だが意味のないtransfer」としてreject、invalid_reason も詳細を返してくれません。クライアント側でfrom != payToをassertするガードを入れるとdebugが一気に楽になります。
動いている結果 — Tornado Cashで64検知
動作確認用にTornado Cashの0.1 ETHプール(0x0000db5c8b...e70000)を叩いた結果:
- risk_level:
CRITICAL - detection_count:
64 - ml_anomaly_score:
0.4381(MLアンサンブル, IF + AutoEncoder + GraphSAGE) - 主な検知: Address Poisoning Received (E6), Peel Chain (E8)を30+ 件、Fake Token URL Phishing (E16) 13件, Sybil Aggregation (E12), Token Relay Chain (E15)
- scan_duration_ms: ~30秒(9チェーンのheuristic + ML + Neo4jを全部走らせて)
支払いはon-chainに確定 — 受取アドレス chainanalyzer.eth (0xe8e26183...708959)に +0.008 USDC のtransferがBasescanで確認できます。
使ってみる
402を試す(支払い無しで価格表だけ取る)
curl -i https://chain-analyzer.com/api/v1/x402/address/0x0000db5c8b030ae20308ac975898e09741e70000/risk-score?chain=ethereum
# HTTP/2 402 Payment Required
# {
# "x402Version": 2,
# "accepts": [
# {
# "scheme": "exact",
# "network": "eip155:8453",
# "price": "$1.00",
# "payTo": "0xe8e26183...708959",
# "asset": {
# "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
# "decimals": 6,
# "eip712": { "name": "USD Coin", "version": "2" }
# }
# },
# { "scheme": "exact", "network": "solana:5eykt4Us...", ... }
# ],
# "extensions": { "bazaar": { "discoverable": true, ... } }
# } Phantomで実際に支払う(ブラウザ、コード不要)
chain-analyzer.com/x402-demo.html を開いてPhantom (Base有効化済み)を接続、「Pay $1.00 USDC and scan」をクリック。EIP-3009のsignプロンプトが出て、~30秒でrisk-score JSONが返ります。Solanaも同様にサポート。
AIエージェントから呼ぶ(TypeScript)
import { createWalletClient, custom } from "viem"
import { base } from "viem/chains"
// Browser: connect Phantom (or any EIP-1193 wallet) to Base mainnet
const wallet = createWalletClient({
chain: base,
transport: custom(window.phantom.ethereum),
})
const [account] = await wallet.requestAddresses()
// Sign EIP-3009 transferWithAuthorization for $1.00 USDC, replay
// the request with X-PAYMENT — middleware verifies + settles via the
// Coinbase CDP facilitator, then returns the risk-score JSON
const res = await fetch(
"https://chain-analyzer.com/api/v1/x402/address/" +
"0x0000db5c8b030ae20308ac975898e09741e70000/risk-score?chain=ethereum",
{ headers: { "X-PAYMENT": buildPayment(account, /* ... */) } },
)
const score = await res.json()
// score.risk_level === "CRITICAL", score.detection_count === 64
// score.detections[i].detector_name === "ADDRESS_POISONING_RECEIVED" ... 提供エンドポイント(全6種、すべてx402ネイティブ)
- GET /api/v1/x402/address/{address}/risk-score — $1.00 USDC、AMLリスク スコア + 検知 + ML異常スコア(8 chain live + BSC coming soon)
- GET /api/v1/x402/address/{address}/sanctions — $0.50、OFAC / FATF / JFSA / ScamDB横断
- GET /api/v1/x402/tx/{tx_hash}/trace — $3.00、資金フロー追跡 + ML異常検知
- GET /api/v1/x402/tx/{tx_hash}/coinjoin — $1.00、BitcoinのCoinJoin / mixing検出
- GET /api/v1/x402/wallet/{address}/cluster — $2.50、Neo4jグラフ クラスタリング
- POST /api/v1/x402/batch/screening — $5.00、最大50アドレスの一括AMLスクリーニング
大局: AIエージェントが自律的にAMLできる時代へ
これで「AIエージェントが取引相手のウォレットを自分でAMLスクリーニングし、その結果に基づいてオンチェーンで意思決定する」という工程が、人間の介在なしに完結します。コンプライアンスやfraud detectionが「人間がダッシュボードを見る」工程から「エージェントが自律検証する」工程に移行する分水嶺です。
ChainAnalyzerはx402 v2 specに準拠した本番AML APIとして、おそらく業界初の実mainnet settlementを成立させた事例になります。Coinbase Bazaarの自動indexingは今後24-48時間以内に反映予定。
リンク
- x402 Live Demo — Phantomでブラウザから直接settle
- x402 Service Manifest (Bazaarが読むJSON)
- x402 Discovery Endpoint (全endpoint一覧)
- x402 Protocol
- Coinbase CDP x402 Docs
- ChainAnalyzer MCP server (npm)