For digital products, services and online shops. Buyers pay straight to your own wallet on BNB Smart Chain; PUQET confirms the payment on the blockchain and tells you.
Create a link for a product or service and share it on Facebook, WhatsApp, Telegram or by email. No website needed.
The buyer sees the amount, your address, a QR code and a timer, then pastes the transaction hash. We check it on-chain.
Show a download link or instructions after payment, or collect a delivery address for physical goods.
Every payment with its status, the buyer's details and a link to the transaction on BscScan.
Create invoices from your own site and get a signed notification the moment a payment is confirmed.
Money goes straight from the buyer to your own wallet. PUQET never holds, moves or settles it.
Only USDT on BNB Smart Chain is supported for now. Card, bank and mobile-money payments are not. Prices are 1–10000 USDT per invoice. You are responsible for your products, delivery, customer support and any refunds, which you send from your own wallet.
Create an API key and a webhook secret in your merchant dashboard (API & webhooks tab). Keep them on your server only. Send amounts as strings.
POST /api/pay/v1/invoices — required: amount, title. Optional: orderRef, customerEmail, customerName, shippingAddress, successUrl (https), expiresInMinutes (15–1440, default 60).
curl -X POST https://puqet.com/api/pay/v1/invoices \
-H "Authorization: Bearer pqk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": "19.99",
"title": "Ebook: Crypto Basics",
"orderRef": "ORDER-1042",
"customerEmail": "[email protected]",
"successUrl": "https://yourshop.com/thank-you",
"expiresInMinutes": 60
}'Response (201). Send the buyer to checkoutUrl.
{
"success": true,
"invoice": {
"id": "inv_…",
"status": "pending", // pending | confirming | paid | underpaid | expired
"amount": "19.99",
"token": "USDT",
"payTo": "0x…your wallet…",
"orderRef": "ORDER-1042",
"checkoutUrl": "https://puqet.com/pay/inv_…",
"txHash": null,
"paidAmount": null,
"expiresAt": "2026-10-20T12:00:00.000Z",
...
}
}GET /api/pay/v1/invoices/{id} with the same Authorization header. Returns the same invoice object.
When an invoice becomes paid (or underpaid), we POST JSON to your webhook URL: { id, type: "invoice.paid" | "invoice.underpaid", created, data: invoice }. The X-Puqet-Signature header is t=<unix time>,v1=<HMAC-SHA256 of "t.body" with your secret>. Answer with any 2xx status. Failed deliveries are retried for about 11 hours; you can also resend from the dashboard. Use orderRef and id to make your handler safe to run twice.
// Node.js (Express): verify X-Puqet-Signature with your webhook secret
import crypto from 'crypto';
app.post('/puqet-webhook', express.raw({ type: 'application/json' }), async (req, res) => {
const header = req.get('X-Puqet-Signature') || ''; // "t=…,v1=…"
const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
const expected = crypto.createHmac('sha256', process.env.PUQET_WEBHOOK_SECRET)
.update(`${parts.t}.${req.body}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
const ok = fresh && parts.v1 && parts.v1.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
if (!ok) return res.status(400).end();
const event = JSON.parse(req.body); // { id, type, created, data: invoice }
if (event.type === 'invoice.paid') {
// Optional but recommended: re-read GET /api/pay/v1/invoices/{id} before delivering.
await markOrderPaid(event.data.orderRef, event.data.txHash);
}
res.status(200).end();
});Never deliver an order because a browser came back to your success page. Wait for the signed webhook, or check the invoice with the API.