Merchant checkout

A hosted checkout page for your site: you create a session, the customer picks a coin and network and pays to the address shown.

In sandbox today

Checkout runs with test money. In sandbox you complete a payment with Simulate a test payment on the link's row under Get paid → Payment links, or with POST /api/v1/checkout/sessions/{id}/simulate. Watching real blockchains for payments needs our chain data keys configured, and paid amounts are recorded in your ledger as a stablecoin credit that can't be spent or withdrawn yet.

Integration paths

PathForStatus
Embed SDKAny site (Webflow, Squarespace, custom)In sandbox
WooCommerce pluginWordPress + WooCommerce storesIn sandbox. Ask support for the plugin
Shopify appShopify storesComing soon

How it works

You create a session (POST /api/v1/checkout/sessions)
        ↓
Customer opens the hosted page (or the embed SDK opens it)
        ↓
Customer picks a coin and network, and pays to the address shown
        ↓
3 confirmations on chain (in sandbox: a simulated payment)
        ↓
Ledger records the payment · checkout.session.completed webhook · email to the owner

Coins and networks

Each coin can be paid on the networks below. The default is USDC. Leave out acceptedChains and the session takes those of Ethereum, Polygon, Arbitrum, Base and Solana that your coins can be paid on; a coin none of them takes (BTC) gets the networks it can be paid on. List networks yourself and a network none of your coins can be paid on is left out: the session's acceptedChains says which ones it kept. A session is refused when one of its acceptedAssets can't be paid on any of its networks, so a link never shows a coin nobody can pay with. One session can ask for up to $100,000.00 (amountUsdCents 10000000).

SOL isn't taken for now: payments in it can't be detected yet, so a session with SOL in acceptedAssets is refused. A link made before a coin and network pair was dropped (USDT on Base, ETH on Polygon, SOL) no longer offers that pair.

Coin (acceptedAssets)TypeNetworks (acceptedChains)
USDC USD CoinStablecoinEthereum (ethereum), Polygon (polygon), Arbitrum (arbitrum), Base (base), Optimism (optimism), Solana (solana)
USDT TetherStablecoinEthereum (ethereum), Polygon (polygon), Arbitrum (arbitrum), Optimism (optimism), Solana (solana)
ETH EtherPrice movesEthereum (ethereum), Arbitrum (arbitrum), Base (base), Optimism (optimism)
BTC BitcoinPrice movesBitcoin (bitcoin)

For a coin whose price moves, the hosted page shows how much of it to send at the rate it is checked against.

A link stays open for expiresInSeconds (5 minutes to 24 hours; the dashboard offers 30 minutes, 2 hours or 24 hours). Get paid lists your 20 most recent links, each as Open, Payment seen, Paid, Paid too little, Failed, Expired or Cancelled. An open link can be cancelled there: it ends at once, and the hosted page tells the customer it was cancelled. After paying, the customer goes to your successUrl; with none, the hosted page tells them the payment was received.

Once a link ends, by running out of time or by being cancelled, nobody can start paying it. A payment a customer already sent is not lost: for an hour after the link ends we keep looking for it, and when it arrives the link moves on to Payment seen and Paid, with the usual ledger record, webhook and email.

Settlement

settlementOption defaults to hold_stablecoin: the payment is recorded in your ledger as a stablecoin credit. convert_to_fiat is accepted but does nothing yet: no automatic conversion or bank payout is made.

Next