Hosted checkout
Every invoice you create comes with a payment_url — a
branded checkout page hosted by us. Send your customer there and we
handle the payment UX (amount, address, QR, countdown, live status).
What the page shows
- Your brand name + accent colour (from settings).
- The exact amount to send, with copy-to-clipboard and a warning that the amount includes the service fee.
- The deposit address with a QR code and copy button.
- A live countdown until the invoice expires.
- A five-step timeline that updates without page reload (SSE): awaiting → seen → confirming → confirmed → paid.
- On success, a button to return to your
success_url. - On failure / expiry, a button to your
fail_url.
Integration
The easiest integration is just a redirect:
// Server-side: after creating the invoice
const invoice = await createInvoice({ /* … */ });
res.redirect(303, invoice.payment_url);Or render a button:
<a href="{{ invoice.payment_url }}" class="pay-btn">Pay with crypto</a>Embedding in an iframe
The page sets X-Frame-Options: DENY and frame-ancestors 'none' by design. Embedding inside an
iframe is not supported — open the URL in a new tab or a top-level
navigation.
Mobile
The hosted page is mobile-first. Address and amount copy use the clipboard API with a textarea fallback for older browsers. QR codes scan with Trust Wallet, MetaMask, Phantom, Tronlink, and any standard wallet app.
Branding
Set your brand name, accent colour, and logo (up to 200 KB data-URL — PNG / JPEG / WebP / SVG) in cabinet settings. The hosted page renders your brand at the top; "Powered by Swap Pay" appears in small text underneath.