npx create-x402-store 로 시작해서 curl 한 번이면
402 가 뜹니다. 검색·견적·결제링크·MCP 는 키 없이 열려 있습니다.
curl -i https://buysign.ai/s/buysign/items/test-payment/buyx402-bind buy https://buysign.ai/s/buysign/items/test-payment/buy --max 1.00내 서버가 402 를 뱉고 결제가 통과하는 것까지가 목표입니다. 설치할 게 없습니다.
npx create-x402-store my-store cd my-store
# .env PAY_TO=0x여기에_당신의_지갑_주소 // 팔린 금액이 여기로 바로 들어옵니다
npm install && npm run dev x402 store → http://localhost:8787 결제 대상 → http://localhost:8787/hello.txt
curl -i http://localhost:8787/hello.txt HTTP/1.1 402 Payment Required PAYMENT-REQUIRED: eyJ4NDAyVmVyc2lvbiI6Mi... { "x402Version": 2, "accepts": [{ "scheme": "exact", "network": "eip155:4663", // Robinhood Chain "amount": "100000", // 0.10 USDG (6 decimals) "asset": "0x5fc5360d0400a0fd4f2af552add042d716f1d168", "payTo": "0x...", "extra": { "name": "Global Dollar", "version": "1" } }] }
# 한도 안인지 확인 (서명은 키가 있어야 합니다) npx x402 test-buy http://localhost:8787/hello.txt --max 1.00 # 실제 서명·결제 pip install x402-bind x402-bind new x402-bind buy http://localhost:8787/hello.txt --max 1.00
import { x402 } from "@buysign/x402/express";
app.get("/report.pdf",
x402({ price: "0.50", payTo: PAY_TO }), // ← 이 한 줄
(req, res) => {
// 결제가 끝난 뒤에만 실행됩니다
res.locals.x402; // { order_id, transaction, payer }
res.sendFile("/report.pdf");
});
| 엔드포인트 | 설명 |
|---|---|
GET/api/search |
q 낱말 검색(한글·영문) · to 목적지 ISO 코드 ·
max 최고가 · limit가격 미정·품절은 결과에 나오지 않습니다. |
GET/api/shops | 열린 상점 목록 |
GET/s/<shop>/catalog | 한 상점의 전체 카탈로그 |
GET/api/demand?days=30 |
사람들이 찾았는데 아무도 안 파는 것. 입점 판단에 쓰세요. |
identity.tcgplayer_product_id 같은 식별자와
verify_price_at 링크가 응답에 들어 있으니 직접 대조하세요.
같은 이름에 27배 차이 나는 상품이 섞여 있어서, 이름만으로 매칭하면 틀립니다.| 엔드포인트 | 설명 |
|---|---|
GET/s/<shop>/items/<sku>/buy?to=US |
X-PAYMENT 없으면 402 + 결제 조건있으면 검증·정산 후 200 + 주문번호 |
POST/orders/<id>/ship |
배송지 제출. 온체인에 올리지 않고 주문번호로만 잇습니다. 조회 응답에 다시 나오지 않습니다 — 제출한 사람만 봅니다. |
GET/facilitator/supported | 지원 레일 |
POST/facilitator/verify |
서명 검증만(읽기 전용). 실패 사유를 고칠 수 있는 말로 돌려줍니다. |
payload = {
"x402Version": 2, "scheme": "exact", "network": "eip155:4663",
"payload": {
"authorization": { "from","to","value","validAfter","validBefore","nonce" },
"signature": "0x..." // EIP-712 TransferWithAuthorization
}
}
X-PAYMENT: base64(json(payload))
accepts[].extra 의 name/version 을 그대로 쓰세요.
틀리면 "서명자 불일치" 로만 보여서 디버깅이 지옥이 됩니다.키가 없는 클라이언트(ChatGPT·Claude 같은)를 위해, 사람이 자기 지갑으로 낼 링크를 만듭니다.
curl -s -X POST https://buysign.ai/api/quote \
-H 'content-type: application/json' \
-d '{"shop":"the-modern","sku":"ascended-heroes-booster-bundle","to":"US"}'
{ "code": "kfpc9v", "url": "https://buysign.ai/p/kfpc9v", "expires_in": 86400 }
링크를 여는 것만으로는 아무 일도 일어나지 않습니다. 돈은 지갑 서명에서만 움직입니다.
셋 다 같은 URL 하나로 붙습니다. 벤더별로 만들 게 없습니다.
https://buysign.ai/mcp // streamable HTTP
| 클라이언트 | 붙이는 법 |
|---|---|
| ChatGPT | 설정 → Security and login → Developer mode → + → 이 URL |
| Claude | Customize → Connectors → Add custom connector → 이 URL (무료 플랜도 1개) |
| Gemini CLI | ~/.gemini/settings.json 의 mcpServers 에 {"httpUrl": "…/mcp"} |
| Claude Code | claude mcp add --transport http x402 https://buysign.ai/mcp |
도구: search_items · get_item · quote ·
checkout_link · list_shops · how_to_pay
buy 도구가 없습니다.
개인키를 받지 않기 때문입니다. 결제는 사용자가 checkout_link 를 열고
자기 지갑으로 서명해서 합니다. 에이전트가 직접 결제하려면
키를 가진 쪽에서 도는 로컬 SDK 를 쓰세요.계정도 비밀번호도 없습니다. 지갑 서명이 곧 신원이고, 그 주소가 곧 수령 주소입니다.
# 1. 서명할 문장을 받는다 POST /api/auth/challenge { "address": "0x..." } # 2. personal_sign 으로 서명하고 세션을 받는다 (30분) POST /api/auth/session { "message": "...", "signature": "0x..." } # 3. 상점을 연다 POST /api/shops { "slug": "my-shop", "name": "My Shop" } # 4. 상품을 올린다 (사진은 data: URL 로 같이) POST /api/shops/my-shop/items { "item": { "sku","title","price_usdc","stock", "photos":[...], "shipping_zones":[...] } }
409 not for sale 이 옵니다.
402 로 임의 금액을 요구하지 않습니다. 판매자가 가격을 넣어야 팔립니다.EIP-3009 는 서명과 제출을 분리합니다. 구매자는 "이 금액을 이 주소로 보내도 좋다" 는 메시지에 서명만 하고, 그걸 체인에 올려 가스를 내는 건 판매자 쪽 릴레이어입니다. 그래서 구매자 지갑에는 스테이블코인만 있으면 됩니다. ETH 가 필요 없습니다.
| 레일 | 자산 | EIP-712 도메인 |
|---|---|---|
eip155:4663Robinhood Chain |
USDG 0x5fc5…1d168decimals 6 |
Global Dollar / 1온체인 DOMAIN_SEPARATOR 와 대조 완료 |
eip155:8453Base |
USDC 0x8335…2913decimals 6 |
USD Coin / 2 |
GET /facilitator/relayer 로 상태를 공개합니다. ready:false 면
정산 요청이 실패합니다. 결제 전에 확인하세요.붙이기 전에 알고 있어야 하는 것들입니다.