Modal over your pageComing soon
The payment window opens over the current page, so the customer keeps their place in the cart.
The payment window opens over your page as a modal, so the customer never leaves the store. The same invoice logic as the hosted checkout page.
Your page opens the payment window with an invoice created through the API.
The customer pays inside the modal, without a redirect.
The final status arrives by webhook and the modal closes.
The payment window opens over the current page, so the customer keeps their place in the cart.
Amount, asset, network and the fixed rate work exactly as on the hosted checkout page.
The order status comes from the final webhook, not from the state of the browser window.
A script call is enough to open the payment window on your store.
Qvard supports several payment products. Pick the one that fits your sales channel.
A quick overview of how Qvard handles payments, integration and merchant operations.
Qvard is a custodial crypto payment gateway for businesses that need hosted checkout, invoices, API payments and merchant balances.
You can accept USDT, USDC, BTC, LTC, TRX, BNB and ETH. USDT is available on several networks, so customers can pay through the route they already use. TON and USDT on TON are coming soon.
Yes. The integration is built around creating a payment, redirecting the customer to redirectUrl and receiving a final webhook status, so orders in your system update automatically.
Yes. You can set the shop name, logo, button color and localized texts so the payment page feels like part of your product. Custom return URLs (successUrl/failUrl) are coming soon.
Create a merchant account and complete business verification. After testing a demo invoice, connect hosted checkout or the API and start accepting real payments.
Funds are tracked in merchant balances separated by asset and network. You can withdraw manually or set up withdrawal rules for automatic payouts.
Integrate the Qvard checkout widget in three ways:
Your public key (qvard_pk_…) can stay in your page code. It only creates payments for your shop—it cannot read data or withdraw funds. It works only from domains listed in your Allowed origins, and is rate-limited.
Need your server to calculate the amount or check inventory? Use the "Via your server" tab: your backend creates the payment with the secret key (qvard_sk_…), and only the payment URL goes to the browser.
<script src="https://qvard.com/checkout.js"></script> <script> // 1. Describe the payment var checkout = new QvardCheckout({ mode: 'modal', publishableKey: 'qvard_pk_YOUR_PUBLISHABLE_KEY', price: 10, orderId: 'order-123', onSuccess: function (e) { // 3. Handle the result console.log('paid', e.paymentId); }, onError: function (err) { console.log(err.code); } }); // 2. Create and show the payment window checkout.open(); </script>
# Create payment on your server curl -X POST https://api.qvard.com/api/v1/payment \ -H 'x-api-key: qvard_sk_YOUR_SECRET_KEY' \ -H 'Content-Type: application/json' \ -d '{"price":10,"id":"order-123"}' # Response: {"id":"...","redirectUrl":"https://my.qvard.com/pay/..."} // Open the payment window in the browser <script src="https://qvard.com/checkout.js"></script> <script> // 1. Describe the payment var checkout = new QvardCheckout({ mode: 'modal', paymentUrl: 'https://my.qvard.com/pay/...', // Take redirectUrl from server response onSuccess: function (e) { // 3. Handle the result console.log('paid', e.paymentId); } }); // 2. Create and show the payment window checkout.open(); </script>
<div id="checkout"></div> <script src="https://qvard.com/checkout.js"></script> <script> // 1. Describe the payment var checkout = new QvardCheckout({ mode: 'inline', target: '#checkout', publishableKey: 'qvard_pk_YOUR_PUBLISHABLE_KEY', price: 10, onSuccess: function (e) { // 3. Handle the result console.log('paid', e.paymentId); } }); // 2. Create and show the payment window checkout.open(); </script>
Full API reference: api.qvard.com/doc
| Option | Description |
|---|---|
| mode | modal | inline |
| target | CSS selector or DOM element (inline mode only) |
| publishableKey | Your public key—required for browser-side payment creation |
| paymentId | UUID of a pre-created payment—required for server-side flow |
| paymentUrl | Full payment URL from server response—required for server-side flow |
| price | Amount in USD (required with publishableKey) |
| orderId | Your transaction ID (optional, max 128 chars, auto-generated if omitted) |
| paymentSystemId | Payment method ID (optional, from your account settings) |
| locale | Payment page language: en, ru, es, pt, tr, id, vi, fr, de (defaults to browser language) |
| theme | light | dark (optional) |
| onSuccess | Callback when payment succeeds: function(e) { console.log(e.paymentId); } |
| onClose | Callback when user closes the window without paying |
| onError | Callback on error: function(err) { console.log(err.code, err.message); } |
Error codes: invalid_mode, invalid_target, invalid_options, invalid_payment_url, network_error, invalid_key, origin_not_allowed, duplicate_order, rate_limited, invalid_request, payment_failed.