How crypto wallets and exchanges let users spend stablecoins by card
Give every user a Visa or Mastercard funded by their USDC or USDT balance, and let them cash out to a bank account.
Crypto wallets, exchanges and Web3 apps whose users hold USDC or USDT and want to spend it in everyday life, or move it back to a bank account.
Create a test customer and a test card in the sandbox, then follow the card.transaction webhook as the card is used.
Your users already hold stablecoins in your app. Today, to pay for a subscription, a flight or groceries, they have to leave: send funds to an exchange, sell, withdraw to a bank, wait. Every step is a chance for them to move their balance to a competitor.
With the KemyCard API, you keep that moment inside your product. Each user gets a Visa or Mastercard card that you load from your balance, and can also cash out by bank transfer to Europe or the United States. No banking license on your side, no card program to negotiate.
What your users get
- A card in seconds: a virtual Visa or Mastercard, usable online and with Apple Pay or Google Pay.
- Top-ups on demand: they choose how much of their balance goes on the card, you load it with one call.
- A real-time feed: every authorization comes to you as a signed webhook, so the activity screen in your app is always up to date.
- A bank cash-out: SEPA Instant to any euro account in the 27 EU countries, or ACH to a US bank account.
How it works
- Create the customer and verify their identity.
POST /v1/customers, thenPOST /v1/kyc/{customerCode}/linkreturns a verification link. You receivekyc.approvedwhen the check passes. - Issue the card. Pick a card product from
GET /v1/cards/productsand create the card with an optional first load. The card is issued asynchronously andcard.activatedtells you when it is ready. - Load it from your balance. When the user moves funds from their crypto balance to the card, you call
POST /v1/cards/{code}/topup. The load and its fee are debited from your KemyCard balance. - Follow every payment.
card.transactionandcard.3ds_requestarrive as signed webhooks.
# Issue a card with a first load of 50
curl https://api.kemycard.com/v1/cards \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{
"customer_code": "CUSTOMER_CODE",
"product_code": "PRODUCT_CODE",
"amount": 50
}'
# Later: top up the card when the user moves funds
curl https://api.kemycard.com/v1/cards/CARD_CODE/topup \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{ "amount": 120 }'
Amounts are plain decimal numbers (120 or 120.50), not cents. Use a sk_test_ key in the sandbox: it returns realistic responses without moving real money.
Add a bank cash-out with Payouts
The same integration lets your users withdraw to their own bank account. You register their bank details once as a beneficiary, request a quote that shows the exact fee, then confirm it. The crypto off-ramp guide walks through it step by step.
Fees by plan
Prices below are read live from our pricing, the same as on the pricing page.
| Plan | Price | Card creation | Card load | Payout ACH / SEPA |
|---|---|---|---|---|
| Découverte | $0/mo | $5 | $1 + 2.5% | $6 + 2.5% |
| Starter | $750/mo | $3.50 | $1 + 2% | $5 + 2% |
| Business | $999/mo | $2.50 | $1 + 1.75% | $5 + 1.75% |
| Premium | $1,999/mo | $1.50 | $1 + 1.5% | $5 + 1.5% |
Why teams choose this setup
- Users stay in your app: spending and cashing out happen where their balance already is.
- One integration: cards, KYC, wallets and payouts share the same keys, customers and webhooks.
- Start without paying: the free Découverte plan lets you launch your first cards and test in an unlimited sandbox.
Build this on the free Découverte plan
No monthly fee to start, an unlimited sandbox with test keys, and the same API you will use in production. Upgrade only when your volume grows.