Payment links
Share a hosted crypto payment page with one request. No checkout to build, funds forwarded to your own wallet.
A payment link is a page on NoncePay that you can send by email, chat or invoice. Your customer opens it, picks a
coin, pays the address shown, and watches the payment confirm. Every payment is forwarded to your own wallet as soon
as it confirms, minus our fee and the network cost, exactly like an address from
/{ticker}/create/: NoncePay never holds the funds.
Payment links are a NoncePay extension: CryptAPI has no equivalent route.
Create a link
One request, no account and no API key. Give a wallet per chain family you accept; the page offers every coin of
those families, or only the ones you list in coins.
curl "https://api.noncepay.app/link/create/?value=49.90¤cy=usd&address_tron=TJzXZQhbhJB3dA2TmxmvyPxk2nKsmZ6yWf&address_evm=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&coins=trc20/usdt,bep20/usdt&item_description=Order%201042&callback=https%3A%2F%2Fshop.example%2Fpaid%3Forder%3D1042&redirect_url=https%3A%2F%2Fshop.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 customer, and store link_id and success_token with your order. 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: '49.90',
currency: 'usd',
addresses: { tron: 'TJzXZQhbhJB3dA2TmxmvyPxk2nKsmZ6yWf', evm: '0xf39F…2266' },
coins: ['trc20_usdt', 'bep20_usdt'],
itemDescription: 'Order 1042',
callback: 'https://shop.example/paid?order=1042',
redirectUrl: 'https://shop.example/thanks',
})| Parameter | Notes |
|---|---|
kind | payment (default) or deposit |
value, currency | payment: the amount to collect, in a fiat currency (usd, eur, …) |
suggested_value, currency | deposit: an amount shown on the page, never enforced |
address_<family> | At least one of address_evm, address_tron, address_btc, address_ltc, address_bch, address_doge, address_sol |
coins | Comma-separated tickers to offer, such as trc20/usdt,bep20/usdt |
callback | Your URL for callbacks |
pending, post, json | As on /create/ |
redirect_url | payment: where the customer is sent once paid |
item_description | Plain text, up to 128 characters |
merchant_name | Plain text, up to 64 characters |
logo_url | An https image URL, up to 2048 characters, shown beside merchant_name; served by you, never hosted by NoncePay |
expire_at | payment: epoch seconds, at least one hour ahead; 7 days by default |
tolerance | payment: percent, 0 to 1, the paid total may fall short and still count as paid; 0 by default |
address_evm covers Ethereum, BNB Smart Chain, Polygon, Base, Arbitrum, Optimism and Avalanche. Every wallet accepts
the split syntax 0.7@addrA|0.3@addrB, and is checked when the link is created, so a mistyped wallet fails before
anyone pays. Every parameter is in the API reference.
Payment or deposit
- A
paymentlink asks for a fixed fiat amount and is paid once. It endspaid,expiredordisabled. - A
depositlink has no amount, or a suggested one, and accepts any number of payments of any amount from the coin's minimum: donations, top-ups. It does not expire and has no paid state; each payment is reported on its own.
What your customer sees
- The page shows your logo and name, your description, the amount and the coins you offer. The logo is loaded from your URL without a referrer and shown at most 40 pixels tall on a dark background, so use a version that reads on dark.
- The customer picks a coin. The page gets an address for that coin and, for a
paymentlink, the amount in the coin at the current rate, locked for 15 minutes. Once the quote expires the page quotes again at the current rate. The same link and coin always give the same address. - The page follows the payment from seen to confirmed. When the link is paid and has a
redirect_url, the customer is sent there withlink_idandsuccess_tokenadded to the query string.
On your redirect_url, compare the success_token in the query string with the one you stored for that link_id.
The redirect comes from the customer's browser: do not ship an order on it. Use the signed callback, or
check that /link/{link_id}/ answers "link_status": "paid".
Callbacks
With a callback, you receive two kinds of notification, both signed with x-ca-signature and retried until you
answer *ok*. Verify them as described in Callbacks.
- Each deposit: the usual payment callback, with
noncepay_link=<link_id>andnoncepay_ticker=<ticker>added to your URL's query string. If you already handle/create/callbacks, there is nothing new to write. - Link paid (
paymentlinks only): one extra callback when the link becomes paid, to your URL as given. It is retried until 3 days after the link was paid.
| Field | Description |
|---|---|
type | payment |
link_id | The link |
value | The amount asked |
currency | Its fiat currency, such as USD |
paid_amount_fiat | The confirmed total in that currency, above value when overpaid |
paid_coin | Coin paid, in underscore form such as trc20_usdt |
paid_amount | Amount paid in that coin |
exchange_rate | Fiat per coin, averaged over the deposits in that coin |
txids | Every transaction counted, comma-separated |
address_in | The address paid |
is_paid | 1 |
A link paid in several coins lists paid_coin, paid_amount, exchange_rate and address_in once per coin,
comma-separated, in the order they were first paid.
Partial, late and extra payments
Each payment is forwarded as soon as it confirms; nothing waits for the total.
- Partial: the link stays open and the page asks for what is left, quoted again at the current rate.
- Overpaid: the surplus is forwarded with the rest, and
paid_amount_fiatshows it. There are no refunds: NoncePay holds nothing to refund from. - After the quote expired: the payment counts at the current price.
- After the link expired or was disabled: the payment is still forwarded and reported by its own callback, but it does not change the link and no link-paid callback is sent.
- Below the coin's minimum: recorded, never forwarded, and it does not count towards the link.
- Tolerance: with
tolerance=0.5, a link of 100 USD counts as paid from 99.50 USD, which covers an exchange that deducts its withdrawal fee.
Limits and abuse
/link/create/allows 30 links a minute and 1,000 a day per IP.- Anyone can create a link, so NoncePay does not vouch for who is behind one: the page says so, and shows the host of
redirect_urlbefore paying. Description and merchant name are plain text. - The page has a Report this link button
(
/link/{link_id}/report/). A link reported for phishing or a scam can be disabled by NoncePay. Disabling is final: the page stops offering a way to pay, and payments already on their way are still forwarded.
Accept crypto payments with Magento
Add a non-custodial crypto payment method to Magento 2 and Adobe Commerce with the NoncePay module. Customers pay orders in USDT, USDC, BTC, ETH, SOL and more, forwarded to your own wallets.
Accept crypto payments with Node.js
Create USDT, USDC or ETH deposit addresses and verify NoncePay callbacks in a Node.js (Express) app.