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:

javascript
// Server-side: after creating the invoice
const invoice = await createInvoice({ /* … */ });
res.redirect(303, invoice.payment_url);

Or render a button:

html
<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.