Accepting crypto on a website takes four things: an address for your customer to pay, a way to know the payment arrived, a way to get the money into your wallet, and a check that the notification is genuine. A payment gateway does the first three for you; this guide shows the whole flow with NoncePay, a non-custodial crypto payment API.
Short answer
- Your server calls
https://api.noncepay.app/{ticker}/create/with your callback URL and your wallet address. - You show the returned
address_in, with a QR code, to your customer. - Once the payment has the confirmations its network needs, it is forwarded to your wallet minus 1.25%.
- Your callback URL receives a signed request with the amounts and transaction ids. You verify the signature, mark
the order paid and answer
*ok*.
No account, no API key, no KYC form to fill on our side, and no balance held for you.
Which coins and networks to accept
Start with what your customers already hold. For most online stores that means:
| Customer wants to pay with | Offer | Why |
|---|---|---|
| Dollars, stable value | USDT on Tron, USDT/USDC on BNB Chain | Most held stablecoins, fast and cheap to move |
| Low fees on Ethereum L2s | USDC on Base, Arbitrum or Optimism | About 20 seconds to your wallet, low network cost |
| Bitcoin | BTC | The coin most people ask for by name |
| Fast and cheap | SOL, USDC on Solana | Finalized in a few seconds |
| Long tail | LTC, DOGE, BCH, ETH, BNB, POL, AVAX… | 88 coins and tokens on 13 networks in total |
Every coin has its own route (btc, trc20/usdt, base/usdc, sol/sol…), minimum and confirmation count: see
supported coins. If you only add one, add USDT on Tron; our
network comparison explains why.
Step 1: create a deposit address
curl "https://api.noncepay.app/base/usdc/create/?callback=https%3A%2F%2Fshop.example%2Fpaid%3Forder%3D1042&address=0xYourWallet&pending=1"
The callback URL is the identity of the address: the same callback always returns the same address, so retrying the request is safe. Put your order id in it. Addresses never expire, so a customer who pays late is still credited.
To pay several wallets from one payment, pass a split instead of one wallet: address=60@0xA…|40@0xB… (up to 20
outputs).
Step 2: show the amount and a QR code
Convert your price into the coin, then show the address and a QR code:
curl "https://api.noncepay.app/base/usdc/convert/?value=49.90&from=usd"
curl "https://api.noncepay.app/base/usdc/qrcode/?address=ADDRESS_IN&value=49.90"
Tell the customer which network to use. A token sent on the wrong network does not arrive at the address you showed.
Step 3: receive the callback
With pending=1, your URL is called twice for each payment: once when the payment appears on-chain (show "payment
received"), and once with pending=0 after it is confirmed and forwarded, with value_coin, value_forwarded_coin,
fee_coin, txid_in and txid_out. Answer HTTP 200 with *ok*; anything else is retried for 3 days.
Step 4: verify the signature
Every callback carries x-ca-signature, an RSA-SHA256 signature of the full URL (GET) or the raw body (POST). Verify it
with the key from /pubkey/ before you ship anything. Ready-made code:
Node.js, PHP, Python.
What it costs
1.25% of each payment, down to 0.25% as the monthly volume of your wallet grows, plus the network cost of forwarding. No sign-up, monthly or withdrawal fee. Fees explained.
Questions
Do I need a company or an account to accept crypto? Not with NoncePay: there is no sign-up. Your own legal and tax obligations as a seller still apply where you operate.
Do I need to run a node or a wallet server? No. We watch the chains, wait for confirmations and forward the money. You only need a wallet that receives it.
Can I use it with an AI coding agent? Yes. Give it our integration prompt or point it at llms-full.txt.
Is there a test mode? Make a small real payment above the coin's minimum: it goes through the same flow and lands in your wallet. The quickstart walks through it.