Skip to main content
A checkout session is a payment intent created from your backend. You get a hosted checkout URL, redirect the customer, and receive a webhook on settlement. Use checkout sessions when you have a developer and want payments embedded in your existing app.

Flow

1

Backend creates the session

POST to /api/merchant/checkout with the USDC amount. Receive checkout_url + session_id.
2

Redirect the customer

Send them to checkout_url. The page shows your business name, the amount, and a deposit address.
3

Customer sends USDC or USDT

Any of 19 USDC chains or 14 USDT chains. Same address.
4

Minisend normalises and settles

USDC on non-Base → CCTP bridge. USDT → swap to USDC on Base (30–50s). Then conversion to local currency, then payout.
5

You receive the result

Webhook on completed, failed, or expired. Or poll the status endpoint at any time.
Customers paying in KES can also choose M-Pesa on the checkout page. The payment prompt includes the 1% fee, and the equivalent USDC is credited to your wallet when the payment completes.

Create a session

POST https://merchant.minisend.xyz/api/merchant/checkout Auth: Authorization: Bearer ms_live_...

Request fields

FieldTypeRequiredDescription
amountnumberYesUSDC amount (>0). Customer pays this as USDC or USDT-equivalent.
descriptionstringNoShown on the checkout page.
external_idstringNoYour reference (e.g., order ID). Echoed back in webhooks.
customer_emailstringNoFor receipt purposes.

Response (201)

Sessions expire after 30 minutes. Create them at the moment of checkout, not earlier.

Using external_id

Pass your order ID as external_id when you create the session. Minisend echoes it back in every webhook so you can reconcile without maintaining a session-to-order mapping.

Check session status

GET https://merchant.minisend.xyz/api/merchant/checkout/{session_id} — no auth.

Status values

StatusMeaning
pendingWaiting for the customer to send
deposit_receivedDetected on-chain; settlement initiated
settlingConversion + payout in progress
completedPayout delivered
failedFailed post-deposit — contact support
expiredNo deposit within 30 minutes

Full example

See Webhook verification for the signature check.