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
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 theline_itemswith 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
| Method | How it works | In the session |
|---|---|---|
| SaphraONE account | The buyer signs in and pays from their balance. They are brought back to the checkout afterwards. | saphraone |
| Any Arc wallet | Connect a wallet (WalletConnect, browser wallets) and send USDC or EURC on Arc. | wallet |
| Card or bank | Circle 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 chain | The 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
| status | Meaning |
|---|---|
open | Waiting for payment. Can be paid until expires_at. |
complete | The full amount has arrived. Fulfil the order. |
expired | The time ran out, or you expired it, before it was fully paid. |
cancelled | You 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"
}