Get started

How Checkout works

A checkout session is one payment request for one order. It holds the amount, the order details the buyer sees, and where to send the buyer afterwards. SaphraONE runs the payment page and watches the chain; your server only creates and reads sessions.

The sequence

Your server creates a session, the buyer pays on the hosted page, then your server confirms itBuyerYour serverSaphraONE APIHosted page + Arc1. Checkout2. POST /checkout/sessionssession.url3. 303 redirect to url4. Pays (wallet, account, card, other chain)5. Receipt, then redirect to success_url6. GET /checkout/sessions/{id}status: complete → fulfil

The hosted payment page

Every session has a url like https://app.saphra.one/checkout/cs_…. The page shows:

  • Your business name, logo, ONE ID and verified badge, so buyers know who they are paying.
  • Your description, or the line_items with their totals.
  • The amount and currency, and a countdown to expires_at.
  • A Cancel and return link to your cancel_url (when you set one). Leaving this way does not cancel the session; it stays payable until it expires.

When the payment lands, the buyer sees a receipt and is sent to your success_url after three seconds, with a Return to button straight away. The page works on phones and needs no app.

How buyers can pay

MethodHow it worksIn the session
SaphraONE accountThe buyer signs in and pays from their balance. They are brought back to the checkout afterwards.saphraone
Any Arc walletConnect a wallet (WalletConnect, browser wallets) and send USDC or EURC on Arc.wallet
Card or bankCircle Onramp buys USDC for the buyer and sends it to you. USDC sessions only, where Onramp is available (mainly US and EU). The buyer verifies their identity once.card_or_bank
USDC on another chainThe buyer pays from Base, Ethereum, Arbitrum, Optimism, Avalanche or Polygon; Circle CCTP brings the USDC to Arc. USDC sessions only.cross_chain

Each payment appears in the session’s payments array with its method, amount, time and an explorer link to the transaction on Arc.

Session lifecycle

statusMeaning
openWaiting for payment. Can be paid until expires_at.
completeThe full amount has arrived. Fulfil the order.
expiredThe time ran out, or you expired it, before it was fully paid.
cancelledYou cancelled it from the SaphraONE dashboard.

payment_status tells you about the money independently: unpaid, partially_paid or paid. See Confirm and fulfil orders for the edge cases.

Where the money goes

Buyers pay your business wallet directly. SaphraONE is non-custodial: it never holds the funds and cannot move them. The chain is the source of truth, and SaphraONE matches each transfer to its session by verifying it on Arc.

{
  "amount": "25",
  "amount_received": "0",
  "amount_refunded": "0",
  "cancel_url": "https://shop.example/cart",
  "client_reference_id": "1042",
  "completed_at": null,
  "created_at": "2026-10-17T09:30:00+00:00",
  "currency": "USDC",
  "customer_email": "ada@example.com",
  "description": "Order #1042",
  "expires_at": "2026-10-17T10:30:00+00:00",
  "id": "cs_live_4f9k2m7q1x8v4b6n0c5d2h7j",
  "line_items": [
    {
      "name": "Linen shirt",
      "quantity": 1,
      "unit_amount": "18.00"
    },
    {
      "name": "Delivery",
      "quantity": 1,
      "unit_amount": "7.00"
    }
  ],
  "livemode": true,
  "metadata": {
    "cart_id": "c_8812"
  },
  "object": "checkout.session",
  "overpayment": "0",
  "payment_status": "unpaid",
  "payments": [],
  "refunds": [],
  "status": "open",
  "success_url": "https://shop.example/thanks?session_id={CHECKOUT_SESSION_ID}",
  "url": "https://app.saphra.one/checkout/cs_live_4f9k2m7q1x8v4b6n0c5d2h7j"
}