AI エージェントが 1 コール $0.008 USDC で叩く AML API を Coinbase x402 Bazaar に出した話
2026-04-28、ChainAnalyzer は Coinbase x402 Bazaar 上で初の本番 mainnet settlement を成立させました。AI エージェントが $0.008 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": "$0.008",
# "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 $0.008 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 $0.008 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 — $0.008 USDC、AML リスク スコア + 検知 + ML 異常スコア (8 chain live + BSC coming soon)
- GET /api/v1/x402/address/{address}/sanctions — $0.003、OFAC / FATF / JFSA / ScamDB 横断
- GET /api/v1/x402/tx/{tx_hash}/trace — $0.015、資金フロー追跡 + ML 異常検知
- GET /api/v1/x402/tx/{tx_hash}/coinjoin — $0.01、Bitcoin の CoinJoin / mixing 検出
- GET /api/v1/x402/wallet/{address}/cluster — $0.02、Neo4j グラフ クラスタリング
- POST /api/v1/x402/batch/screening — $0.05、最大 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)