Accept crypto payments
A link or a button for your own site, priced in your coin or in dollars — or asking for no fixed amount at all, which is what a donation is. Your customer pays in whatever coin they hold; you receive the one you asked for. No account, no sign-up, no API key — the request is built in the browser and carried in the link, so nothing about it reaches this site.
what lands, not what they send
The payer is shown what to send for this much to arrive, priced across every provider. What lands is the figure above.
An expiry is a note to the payer, not a lock. They will be told the request lapsed and shown what was asked for — nothing here can stop a late payment, because nothing here holds the transfer.
The link to send
Enter an amount above zero.
Before you send this to anyone
This link carries the whole request, and nothing about it is stored by this site. The checksum catches a link that was damaged or cut short in copying — it does not prove who wrote it. Anyone able to change the link can change the address the funds go to, and no checksum can detect that. Confirm the address and the amount with the person you are paying, through something other than the link itself.
In practice: send it the way you would send an invoice, and expect the person paying to confirm the address with you by some other means. That is not a weakness of this link in particular — it is true of every payment request anybody has ever emailed.
To see what the payer sees, open the link. The payment page prices the request across every provider at once and shows them what they would need to send.
Preview
The page your payer opens, priced live across every provider.
Fill in an amount and an address and the preview can be drawn.
What your customers see
Rendered here by the same script the snippet below installs, from the values above.
Fill in an amount and an address above and the button appears here.
Put it on your own site
Two tags render a Pay with crypto button. The request is built in your customer’s browser and carried in the link, so nothing about it reaches this site — the same property the link above has, and the reason this is a script rather than an iframe.
Showing example values until the request above is complete.
- data-amount
- What must arrive. Set it from your total before the script runs.
- data-fixed
- send to fix what the customer pays instead, so the exchange cost comes out of what reaches you.
- data-expires
- Unix seconds. A note to the payer, not a lock — nothing here holds a transfer.
- scan()
- CryptoTrainPay.scan() redraws buttons after a total changes. It is the only thing the script adds to the page.
Why the long attribute. That hash is the browser’s guarantee that the script it runs is the one hashed here. If this site were ever compromised, a tampered script would fail the check and simply not run — your checkout loses a button rather than gaining an attacker. It works only because /pay.v1.js is frozen: changes ship as a new version with a new hash. /pay.js follows along instead and cannot be pinned, which is the easier install and the weaker one.
The address in the markup is public, and a customer who edits it pays themselves rather than you — which is the ordinary property of a checkout, not of this format. What the format cannot defend against is the link being altered in transit, and the payment page states that in those terms.
Share it anywhere
Every format carries the same link. The request stays after the #, so a README view sends nothing about it here.
Complete the request above to fill these in.
What happens when somebody pays
- 1. They open your link and see what you asked for: the amount, the coin, your note.
- 2. They pick any coin they hold. All 18 providers are priced at once and the best is first, so they send the least it can cost.
- 3. They send to the deposit address. Your coin arrives at your address, from the provider, direct.
Nothing custodial happens in between. The funds go from your customer to a provider to you — this site never holds them, and could not.
What we never have
Your request is encoded into the part of the link after the #, which browsers never send to a server. Not ours, not anybody’s. So there is no invoice record here to leak, subpoena or lose: no merchant account, no payout address on file, no list of who paid you.
That is also the limit of it, said plainly rather than left out. The provider your customer picks sees their deposit and your payout address, the way it would in any exchange — what each one keeps and demands is measured and published, and who sees what sets out the rest.
What it costs you
Nothing to install and nothing per payment from us. The provider’s own spread is inside the rate your customer is shown, as it is everywhere on this site, and the comparison exists to make that number as small as it can be.
A button on your checkout is a script from somebody else’s domain, which is the most dangerous thing on this page. The snippet above pins it to a frozen address with an integrity hash, so the browser refuses anything but the exact bytes you reviewed — including from us. That is the arrangement we would want from a stranger, so it is the default here rather than a footnote.
Already been sent a payment link? It opens at CryptoPay.