Get Started
Quickstart
Take your first payment end to end. Every intent is priced in USD; the buyer chooses which asset to pay in, and Zuuppa detects the funds on-chain and sweeps them to your wallet. This walkthrough uses cURL — the flow is just HTTPS, so it maps to any language.
You'll need an sk_ API key. Your backend calls POST /intents and reads GET /status (both need the key); your frontend can drive checkout with the per-intent cs_ client secret returned on create. Order fulfillment is always a backend decision keyed off the swept status or the intent.swept webhook — never trusted from the browser.
The 10-minute window
Every checkout lasts a fixed 10 minutes and auto-cancels if unpaid, so nothing ever sitspending forever. The window cannot be lengthened or shortened.Five steps to your first payment#
- 1
Get an API key
Sign up for a dashboard account, set your sweep destination, platform-fee handling, and webhook on the Settings page, then create an API key. The full key (
sk_live_...orsk_test_...) is shown once at creation — store it securely and keep it server-side.Shellexport ZUUPPA_API_KEY="sk_live_..." # from your dashboard, kept on the server - 2
Create a payment intent
Price in USD cents and list the assets the buyer may pay in. Pass a stable
reference(your order id) — it doubles as the idempotency key, so a retry returns the same deposit address instead of creating a second one.cURLcurl -X POST https://api.zuuppa.com/intents \ -H "Authorization: Bearer $ZUUPPA_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "amount_usd_cents": 5000, "accepted_tokens": [ { "kind": "sol" }, { "kind": "spl", "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" } ], "reference": "order-1001" }'200 OKPOST /intentsJSON{ "id": "1c9e...", "derivation_index": 42, "address": "9xQe...pump", "client_secret": "cs_...", "price_usd_cents": 5000, "mint": null, "mint_decimals": null, "expected_lamports": null, "status": "pending", "expires_at": "2026-08-18T14:08:02Z" }Store
derivation_indexagainst your order (you poll status with it), showaddressto the payer, and forwardclient_secretto your client if it will select the token.mintandexpected_lamportsarenulluntil the buyer picks an asset. - 3
Let the buyer pick an asset
Nothing is payable until the buyer chooses one of
accepted_tokens. This call is authorized by thecs_client secret, so an untrusted client can make it directly — no API key needed.cURLcurl -X POST https://api.zuuppa.com/intents/select-token \ -H 'Content-Type: application/json' \ -d '{ "client_secret": "cs_...", "mint": null }'This locks
mint,mint_decimals, andexpected_lamports(the USD price converted at spot), and returns apayment_urithat now carries the amount. Selection is re-runnable whilependingand refused with409once a payment lands. To show what each option costs first, readGET /intents/quote?client_secret=cs_.... - 4
Show the deposit address
Render
payment_urias the QR code and showaddressas text beside it — it's a Solana Pay URI built server-side, so don't assemble one yourself. It's omitted before token selection (fall back to a QR of the bare address) and once the intent can no longer be paid; on anunderpaidintent it asks for the remaining shortfall. Re-render from the latest status response. - 5
Learn the outcome and fulfill
Prefer webhooks for fulfillment; use polling for live UI. Poll
GET /status?index=Nuntil the status is terminal:cURLcurl -H "Authorization: Bearer $ZUUPPA_API_KEY" \ "https://api.zuuppa.com/status?index=42"When the payment is received and settled:
200 OKGET /status?index=42JSON{ "status": "swept", "action": "swept", "message": "Payment received and settled.", "settlement": { "asset": "SOL", "decimals": 9, "destination_amount": 499995000, "destination_ui": 0.499995, "platform_fee_amount": 0, "platform_fee_ui": 0.0, "signatures": ["4bd..."] } }sweptmeans the money is yours.settlement.destination_amountis exactly what landed in your treasury wallet (net of the network fee, any platform fee, and any refunded overpayment) — use it for your books.
Next steps
Read Core concepts to understand intents, the settlement lifecycle, and USD pricing, then follow the Custom checkout guide for a complete backend + frontend integration with example code.