Cards
A card is a virtual prepaid payment instrument. It carries a PAN, CVV, expiry date, and a spendable balance. Cards are issued against a product — the product is the template that determines the card’s scheme (Visa/Mastercard), currency, spending limits, 3DS, and tokenization support.Prerequisites for Issuance
Two conditions must be met before a card can be issued:- Cardholder
kycStatusmust beAPPROVED— attempting to issue to an unapproved cardholder returns422 CARDHOLDER_KYC_NOT_APPROVED - The product’s program must be
ACTIVE— a paused or closed program blocks card creation under that product
SANDBOX and LIVE.
Issuing a Card
You need acardholderId and a productId. The product determines everything else — program, scheme, currency, and limits — so there is no need to specify a programId.
POST /cards/{id}/fund to load it before the cardholder can spend.
Discover available productId values via GET /programs/{programId}/products.
Card Lifecycle
Card Statuses
Balance Flow
All card operations move money between the program ledger and the card balance:
You never lose money when terminating a card. The full remaining balance returns to the program ledger automatically.
Fund a Card
amountis in dollars (100.00= $100)- Always use
Idempotency-Key— if your request times out and you retry, the card won’t be double-funded CARD_FUNDEDwebhook fires on success;CARD_FUND_FAILEDon failure- Funding a frozen card is allowed — balance is added; spending re-enables after unfreezing
Unload a Card
- Cannot unload more than the card’s current available balance →
422 INSUFFICIENT_CARD_BALANCE CARD_UNLOADEDwebhook fires on success;CARD_UNLOAD_FAILEDon failure
Freeze and Unfreeze
Temporarily block a card from making purchases without touching its balance:- A frozen card rejects all authorization attempts at the card network level
- Frozen cards can still be funded and unloaded
409 CARD_ALREADY_FROZEN/409 CARD_NOT_FROZENguard against double-transitions
Terminate a Card
Termination is permanent and irreversible. The"confirm" field prevents accidental calls:
"confirm": "TERMINATE_CARD" returns 400 CONFIRMATION_REQUIRED.
What happens:
- All pending authorizations are reversed
- Remaining balance is returned to the program ledger
- Card status becomes
TERMINATEDpermanently CARD_TERMINATEDwebhook fires
409 CARD_HAS_PENDING_TRANSACTIONS. Authorizations typically clear within 24–72 hours. Retry after they settle.
Replace a Card
Issue a replacement for a compromised or lost card:CARD_TERMINATED fires for the old card and CARD_ISSUED for the new one.
Masking and Sensitive Data
The CaaS API never returns full card numbers or CVV. All card data is masked:
Full card credentials are displayed to the cardholder through your in-app secure card widget or the CaaS-provided display component. Contact your account manager for the secure card-detail integration guide.
Just-In-Time (JIT) Cards
Some products support JIT funding — cards issued with no pre-loaded balance. When the cardholder makes a purchase, Fyatu checks your program ledger balance in real time and approves or declines the authorization automatically. JIT is controlled by the product (hasJIT: true). If a product has JIT enabled, amount is optional at card creation time:
CARD_ISSUED webhook will include "isJitfEnabled": true. Every authorization attempt then fires CARD_AUTHORIZATION with the decision.
See the JIT Cards guide for the full flow, sandbox testing, and program balance management.
Webhook Events
Endpoints
POST /cards— Issue cardGET /cards— List cardsGET /cards/{id}— Get cardPOST /cards/{id}/fund— Fund cardPOST /cards/{id}/unload— Unload cardPOST /cards/{id}/freeze— Freeze cardPOST /cards/{id}/unfreeze— Unfreeze cardPOST /cards/{id}/terminate— Terminate card

