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.

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.

Terminal
curl "https://api.noncepay.app/link/create/?value=49.90&currency=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"
Response
{
  "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:

create-link.ts
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',
})
ParameterNotes
kindpayment (default) or deposit
value, currencypayment: the amount to collect, in a fiat currency (usd, eur, …)
suggested_value, currencydeposit: 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
coinsComma-separated tickers to offer, such as trc20/usdt,bep20/usdt
callbackYour URL for callbacks
pending, post, jsonAs on /create/
redirect_urlpayment: where the customer is sent once paid
item_descriptionPlain text, up to 128 characters
merchant_namePlain text, up to 64 characters
logo_urlAn https image URL, up to 2048 characters, shown beside merchant_name; served by you, never hosted by NoncePay
expire_atpayment: epoch seconds, at least one hour ahead; 7 days by default
tolerancepayment: 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 payment link asks for a fixed fiat amount and is paid once. It ends paid, expired or disabled.
  • A deposit link 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

  1. 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.
  2. The customer picks a coin. The page gets an address for that coin and, for a payment link, 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.
  3. The page follows the payment from seen to confirmed. When the link is paid and has a redirect_url, the customer is sent there with link_id and success_token added 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> and noncepay_ticker=<ticker> added to your URL's query string. If you already handle /create/ callbacks, there is nothing new to write.
  • Link paid (payment links 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.
FieldDescription
typepayment
link_idThe link
valueThe amount asked
currencyIts fiat currency, such as USD
paid_amount_fiatThe confirmed total in that currency, above value when overpaid
paid_coinCoin paid, in underscore form such as trc20_usdt
paid_amountAmount paid in that coin
exchange_rateFiat per coin, averaged over the deposits in that coin
txidsEvery transaction counted, comma-separated
address_inThe address paid
is_paid1

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_fiat shows 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_url before 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.

On this page