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.
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
| Path | For | Status |
|---|---|---|
| Embed SDK | Any site (Webflow, Squarespace, custom) | In sandbox |
| WooCommerce plugin | WordPress + WooCommerce stores | In sandbox. Ask support for the plugin |
| Shopify app | Shopify stores | Coming 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) | Type | Networks (acceptedChains) |
|---|---|---|
USDC USD Coin | Stablecoin | Ethereum (ethereum), Polygon (polygon), Arbitrum (arbitrum), Base (base), Optimism (optimism), Solana (solana) |
USDT Tether | Stablecoin | Ethereum (ethereum), Polygon (polygon), Arbitrum (arbitrum), Optimism (optimism), Solana (solana) |
ETH Ether | Price moves | Ethereum (ethereum), Arbitrum (arbitrum), Base (base), Optimism (optimism) |
BTC Bitcoin | Price moves | Bitcoin (bitcoin) |
For a coin whose price moves, the hosted page shows how much of it to send at the rate it is checked against.
Link lifetime
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
- Embed SDK:
<script src="checkout.js"> - WooCommerce plugin
- Shopify app: status
- API reference: checkout