Crypto payment links: get paid in USDT, BTC or ETH

A crypto payment link is a page you send instead of a wallet address. Your customer opens it, picks the coin they hold, pays the amount shown, and watches the payment confirm. With NoncePay, one request creates the link, the page is hosted for you, and every payment is forwarded to your own wallet as soon as it confirms. There is no account, no API key and no checkout to build.

Short answer

  1. Call https://api.noncepay.app/link/create/ with an amount in your currency and your wallets.
  2. Send the payment_url it returns by email, chat, invoice or in your bio.
  3. Your customer pays in USDT, USDC, BTC, ETH or another coin you accept, and the money reaches your wallet once it confirms, minus 1.25%.

All three forward payments straight to your wallet. They differ in what you build:

  • Payment link: you send a URL and NoncePay hosts the page. Best for invoices, one-off sales, donations and anything you sell through a chat or an email rather than a checkout.
  • API: /{ticker}/create/ returns a deposit address and you show it in your own interface. Best when the payment step lives inside your app, as in our website guide.
  • WooCommerce plugin: a crypto option at checkout for a WordPress store, covered in our WooCommerce guide.

A link has one of two kinds, set by kind:

KindAmountPaid
payment (default)Fixed, in USD, EUR or another fiatOnce; expires in 7 days by default
depositNone, or a suggested amountAny number of times; never expires

Some scenarios:

  • A freelancer's invoice. One payment link per invoice for 1,200 EUR, with the invoice number as description. The link stays open 7 days by default, or until the expire_at you set.
  • A one-off sale. Selling a domain, a design or a used laptop to someone you met online: a payment link for the agreed price, with a redirect_url back to your site once paid.
  • Streamer and creator donations. One deposit link with a suggested 5 USD, shared in your bio, your chat or on your stream overlay. Supporters pay any amount from the coin's minimum, and each donation is notified on its own.
  • Account top-ups. One deposit link per user, with the user id in the callback URL: each deposit tells your app whose balance to credit. The top-ups use case compares it with a plain address per user.

How your customer pays

The page shows your logo and name, your description, the amount and the coins you offer. It is available in eight languages, picked from the customer's browser.

  1. They pick a coin. The page offers every coin of the wallets you gave, or only the ones you list in coins, for example USDT on Tron and BNB Smart Chain.
  2. The rate is locked. For a payment link, the amount in that coin is quoted at the current rate and locked for 15 minutes. After that, the page quotes again at the current rate.
  3. They pay and watch it confirm. The page shows the address and a QR code, then follows the payment from seen to confirmed. Once a payment link is paid, the customer is sent to your redirect_url.

Payments in several parts add up. If your client sends less, the link stays open and the page asks for what is left. An exchange that deducts its withdrawal fee leaves a small remainder: set tolerance (a percent, up to 1) to count the link as paid anyway.

How you get paid

NoncePay never holds the money. Each payment goes to an address created for your link, and once it has the confirmations its network needs, it is forwarded to your wallet, minus 1.25% (down to 0.25% with volume) and the network cost. Nothing waits for the full amount: a partial payment is forwarded as soon as it confirms. There is no balance to withdraw and no monthly fee. Fees in detail, or the pricing.

Wallets are given per chain family: address_evm covers Ethereum, BNB Smart Chain, Polygon, Base, Arbitrum, Optimism and Avalanche, and there is one each for Tron, Bitcoin, Litecoin, Bitcoin Cash, Dogecoin and Solana. A wallet can also be a split such as 0.7@addrA|0.3@addrB, to share each payment with a partner.

One request, here for an invoice in euros paid in USDT on Tron or BNB Smart Chain:

curl "https://api.noncepay.app/link/create/?value=1200&currency=eur&address_tron=YOUR_TRON_WALLET&address_evm=YOUR_EVM_WALLET&coins=trc20/usdt,bep20/usdt&item_description=Invoice%202026-014&merchant_name=Studio%20Example&callback=https%3A%2F%2Fstudio.example%2Fpaid%3Finvoice%3D2026-014&redirect_url=https%3A%2F%2Fstudio.example%2Fthanks"
{
  "status": "success",
  "link_id": "3f6c2a1e-8b4d-4c7a-9e21-5d0f7b9a6c13",
  "payment_url": "https://checkout.noncepay.app/?id=3f6c2a1e-8b4d-4c7a-9e21-5d0f7b9a6c13",
  "success_token": "q3J8vT0mZk6xR1yH5wN2bC9dL4sF7gA0eU8iO3pK6jM"
}

Send payment_url to your client and keep link_id and success_token with the invoice. A donation link is the same request with kind=deposit and suggested_value=5&currency=usd instead of value, and without redirect_url, which only payment links use.

With the Node.js SDK:

import { NoncePay } from '@nonceapp/api'

const noncepay = new NoncePay()

const { link_id, payment_url, success_token } = await noncepay.createLink({
  value: '1200',
  currency: 'eur',
  addresses: { tron: 'YOUR_TRON_WALLET', evm: 'YOUR_EVM_WALLET' },
  coins: ['trc20_usdt', 'bep20_usdt'],
  itemDescription: 'Invoice 2026-014',
  merchantName: 'Studio Example',
  logoUrl: 'https://studio.example/logo.png',
  callback: 'https://studio.example/paid?invoice=2026-014',
  redirectUrl: 'https://studio.example/thanks',
})

Every parameter is in the API reference.

Know when it is paid

With a callback, you get two kinds of notification, each signed with x-ca-signature and retried for up to 3 days until you answer *ok*:

  • Each payment: the usual payment callback, with noncepay_link and noncepay_ticker added to your URL. If you already handle /create/ callbacks, there is nothing new to write.
  • Link paid (payment links only): one extra callback when the link is fully paid, with the amount asked, the total paid in your currency, the coin and the transaction ids.

The redirect to your redirect_url carries link_id and success_token, so you can match it to the link you created. It comes from the customer's browser, so never deliver on it alone: rely on the signed callback, or check that /link/{link_id}/ answers "link_status": "paid". Callbacks shows how to verify the signature.

Anyone can create a link, so the page shows the host of your redirect_url before payment and carries a Report this link button. NoncePay can disable a link reported for phishing or a scam; payments already on their way are still forwarded.

Questions

Do I need to write code? Creating a link takes one HTTP request, from a terminal, a script or the SDK. The page your customer sees needs nothing else from you.

What happens if my client pays after the link expired? The payment is still forwarded to your wallet and reported by its own callback, but it does not mark the link paid. Create a new link for what is left.

Can I accept Bitcoin and USDT on the same link? Yes. Give a wallet for each chain family you accept, address_btc and address_tron for example, and the customer picks one.

What if the customer sends too much? The surplus is forwarded with the rest, and the link-paid callback reports the total. NoncePay holds nothing, so it cannot refund it.

Is there a minimum? Each coin has a minimum payment. A payment below it is recorded but never forwarded, and does not count towards the link. The coin list gives every minimum.

The full reference, with every field of the callbacks, is in the payment links guide.

More guides