// ドキュメント

開発者向けドキュメント

NextCryptoPay を数分で導入できます。一般的な連携の流れは次のとおりです。

AIエージェントで開発していますか?

Claude Code、Codex、CursorなどのAIエージェントでプロジェクトを開発している場合は、docs-agent.md をダウンロードしてエージェントに渡してください。NextCryptoPayを自動統合するために必要な情報がすべて含まれています。

docs-agent.md をダウンロード

1. APIキーを作成

ダッシュボード → APIキー でキーを生成します。シークレットはサーバーに保管し、ブラウザには置かないでください。

2. 請求書を作成

金額、通貨、チェーンを請求書エンドポイントに POST し、返却されたチェックアウトURLへお客様をリダイレクトします。

3. Webhookを受信

請求書が支払い済み、確認中、または期限切れになると、署名付きWebhookを送信します。Webhookシークレットで署名を検証してください。

認証

すべてのリクエストで、Authorization ヘッダーにシークレットキーを含めて認証してください。キーはダッシュボード → APIキー でショップごとに作成します(完全なキーは一度だけ表示されます)。

請求書を作成

注文金額とアセットを送信します(chain は任意)。ホスト型の checkoutUrl が返るので、顧客をそこへリダイレクトしてください。chain を省略すると、顧客が支払いページでネットワークを選びます。

リクエスト

curl -X POST https://nextcryptopay.com/api/v1/invoices \
  -H "Authorization: Bearer ncp_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "orderId": "ORDER-1001",
    "amount": 99.50,
    "currency": "USD",
    "chain": "tron",
    "asset": "USDT",
    "webhookUrl": "https://yourstore.com/webhooks/nextcryptopay",
    "redirectUrl": "https://yourstore.com/thank-you"
  }'

レスポンス

{
  "id": "inv_abc123",
  "orderId": "ORDER-1001",
  "payAddress": "TJ9xH4n2k8sQw7Lm3vR5pZ1aB6cD8eF2g",
  "cryptoAmount": "99.50",
  "asset": "USDT",
  "chain": "tron",
  "status": "PENDING",
  "expiresAt": "2026-06-17T10:00:00.000Z",
  "checkoutUrl": "https://nextcryptopay.com/pay/inv_abc123"
}

redirectUrl は支払いの数秒後にお客様を戻す先です。省略した場合はショップの戻り先 URL(Dashboard → Webhooks)が使われます。どちらか一方は必ず設定してください。どちらも無いと、お客様は決済ページに取り残されます。その URL に誰かが訪れただけで出荷しないでください。支払いを証明できるのは署名を検証した invoice.paid Webhook だけです。

支払いステータスを追跡

請求書をポーリングするか、Server-Sent Events でライブ更新を購読します。ステータス:PENDING → CONFIRMING → PAID(または EXPIRED / PARTIALLY_PAID)。

# Poll the invoice
curl https://nextcryptopay.com/api/v1/invoices/inv_abc123

# Or subscribe to live updates (Server-Sent Events)
GET https://nextcryptopay.com/api/v1/invoices/inv_abc123/stream

Webhookを検証

ステータスが変わるたびに、署名付きイベントをお客様の Webhook URL へ POST します。信頼する前に x-nextcryptopay-signature ヘッダー(ショップのWebhookシークレットを使用した生ボディの HMAC-SHA256)を検証してください。15秒以内に 2xx を返してください — そうでない場合はバックオフ付きで再試行します。 旧来の x-cryptopay-* ヘッダーは 2027年3月31日まで同じ値で並行して送信されます。新しいコードでは x-nextcryptopay-* を使用してください。

import crypto from "node:crypto";

// Legacy x-cryptopay-* headers carry identical values and are still sent in
// parallel until 2027-03-31 — prefer x-nextcryptopay-* in new code.
app.post("/webhooks/nextcryptopay", (req, res) => {
  const signature = req.headers["x-nextcryptopay-signature"];
  const timestamp = req.headers["x-nextcryptopay-timestamp"];

  // Reject stale deliveries (replay protection): within 5 minutes
  if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) {
    return res.status(401).end();
  }

  // Signature is HMAC of "timestamp.rawBody"
  const expected = crypto
    .createHmac("sha256", process.env.NEXTCRYPTOPAY_WEBHOOK_SECRET)
    .update(timestamp + "." + req.rawBody) // raw JSON body
    .digest("hex");

  if (
    signature.length !== expected.length ||
    !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))
  ) {
    return res.status(401).end();
  }

  // Dedupe by delivery id (same event may be retried)
  const deliveryId = req.headers["x-nextcryptopay-delivery"];
  if (alreadyProcessed(deliveryId)) return res.status(200).end();

  const { event, invoice } = req.body;
  if (event === "invoice.paid") fulfillOrder(invoice.orderId);

  res.status(200).end(); // reply 2xx within 15s, else we retry (6 attempts, backoff)
});

対応チェーン

Tron (USDT/USDC · TRC20), Ethereum (USDT/USDC · ERC20), BSC (USDT · BEP20), TON (USDT · jetton), Bitcoin (BTC). 成功した支払いごとにプラットフォーム手数料がかかり、1 取引あたりの上限が設定されています。手数料は前払い USDT 残高から差し引かれます(またはプランの利用枠で賄われます)。現行の料率は料金ページをご覧ください。