How to accept crypto payments on your website: the complete guide

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

  1. Your server calls https://api.noncepay.app/{ticker}/create/ with your callback URL and your wallet address.
  2. You show the returned address_in, with a QR code, to your customer.
  3. Once the payment has the confirmations its network needs, it is forwarded to your wallet minus 1.25%.
  4. 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 withOfferWhy
Dollars, stable valueUSDT on Tron, USDT/USDC on BNB ChainMost held stablecoins, fast and cheap to move
Low fees on Ethereum L2sUSDC on Base, Arbitrum or OptimismAbout 20 seconds to your wallet, low network cost
BitcoinBTCThe coin most people ask for by name
Fast and cheapSOL, USDC on SolanaFinalized in a few seconds
Long tailLTC, 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.

More guides