Mainnet validation is in progress. Payments and new API keys are disabled.View readiness

Embed Builder

Generate your embed in 30 seconds.

Paste your publishable key, choose a button type, and copy the snippet. Drop it on your site. Done.

Use pk_test_ for the isolated, non-payable sandbox. Switch to pk_live_ only after live payment access is enabled.

Catalog: shows every product you've created. Product: a specific product or subscription. Donation: fixed dollar amount, one-time.

<!-- 1. Drop this once anywhere in your site (best in <head> or just before </body>) -->
<script src="https://xmrgate.com/embed.js" data-pk="pk_test_YOUR_PUBLISHABLE_KEY" async></script>

<!-- 2. Add as many of these buttons as you want -->
<button data-xmrgate-pay>Pay with crypto</button>
<script>
  XMRGate.open({
    
    
    
    
    onSuccess: (e) => {
      console.log("paid", e.checkoutId, e.txHash);
      // fulfill the order
    },
    onCancel: () => console.log("cancelled"),
  });
</script>
Live preview: add ?pk=pk_test_YOUR_PUBLISHABLE_KEY to /embed/v1 to see exactly what your buyers will see.

Lifecycle events

The embed posts these events back to your page via window.postMessage. Subscribe via onSuccess, onCancel in the programmatic API. The loader validates both the XMRGate origin and active iframe before invoking either callback.

checkout.createdBuyer hit Pay — payUrl ready, checkoutId returned
payment.detectedBuyer's tx is in mempool
payment.confirmingOn-chain, building confirmations
payment.confirmedFinalized — safe to fulfill the order
payment.cancelledQuote expired without payment

Free forever for the first $5,000/month.

Sign up takes 60 seconds. The embed takes 30 more.