URL: /paas/fincard-virtual/card-issuance-flows
---
title: 'Card Issuance Flows'
description: 'Step-by-step processes for Virtual, Physical, Shared, and Gift card issuance'
---
# Card Issuance Flows
## Introduction
FinCard Virtual is a card-issuing service built on the FinCard platform. It enables tenants to programmatically issue, manage, and monitor prepaid cards — virtual or physical — for their end customers (B2B or B2C).
All endpoints are available for interactive testing at **`https://sandbox.finhub.cloud`**. Each endpoint page includes a **Try It** panel where you can send live requests against the sandbox.
---
### Architecture Overview
```
Your Application
│
▼
FinHub BFF (/api/v2.1/fincard/virtual/...)
│
├── Playground mode → in-memory JPA/MariaDB (no external calls)
└── Integration mode → FinCard Virtual Production API (RSA-signed)
```
The BFF operates in one of two modes based on tenant configuration:
| Mode | Description | Use case |
|------|-------------|----------|
| **Playground** | Fully simulated — all data stored in sandbox DB | Development & testing |
| **Integration** | Live calls to FinCard Virtual API (RSA-signed) | Production |
---
### Prerequisites
Before issuing any card, ensure:
1. **Tenant credentials** — valid `X-Tenant-ID` header on every request
2. **Account funded** — the tenant's WALLET account has sufficient balance
3. **Card BINs available** — call `POST /card/v2/cardTypes` to discover available BINs and their requirements
4. **Cardholder created** (if `needCardHolder: true` on the BIN) — cardholder must reach `status: pass_audit` before a card can be linked
All API bodies are raw JSON strings (`Content-Type: application/json`). The BFF forwards them directly to FinCard Virtual after signature verification.
---
### Choose Your Card Type
```
Start
│
├─► Need multiple cards sharing a pool? ──► Shared Card (BUDGET_CARD)
│
├─► Physical card issued offline? ────────► Physical Card
│
├─► Redemption URL only (no card number)? ► Gift Card
│
└─► Standard virtual prepaid? ────────────► Virtual Card (PREPAID_CARD)
```
| Card Type | BIN Mode | BIN Type | Category |
|-----------|----------|----------|----------|
| **Virtual** | `PREPAID_CARD` | `Virtual` | `PURCHASE` / `SUBSCRIPTION` |
| **Physical** | `PREPAID_CARD` | `Physical` | `PHYSICAL` |
| **Shared** | `BUDGET_CARD` | `Virtual` | `PURCHASE` |
| **Gift** | `PREPAID_CARD` | `Virtual` | `GIFT` |
---
### Common Headers
Every request requires:
| Header | Description |
|--------|-------------|
| `X-Tenant-ID` | Your tenant identifier |
| `Content-Type` | `application/json` |
---
Four card issuance processes, each with a distinct flow. All share the same API endpoints but differ in required steps and configuration.
---
## 1. Virtual Card (PREPAID_CARD)
The standard flow for issuing virtual prepaid cards.
```mermaid
flowchart TD
S(( )) --> GetCardBIN[GetCardBIN]
GetCardBIN -->|needCardHolder?| CheckHolder{CheckHolder}
CheckHolder -->|Yes| CreateHolder[CreateHolder]
CheckHolder -->|No| CreateCard[CreateCard]
CreateHolder --> WaitApproval[WaitApproval]
WaitApproval -->|Approved| CreateCard
CreateCard --> QueryInfo[QueryInfo]
QueryInfo --> GetSensitive[GetSensitive]
GetSensitive --> E([Ready to use])
```
| Step | API | Description |
|------|-----|-------------|
| 1 | `POST /card/v2/cardTypes` | Get available card BINs. Filter `mode=PREPAID_CARD`, `type=Virtual` |
| 2 | Check `needCardHolder` | If `true`, create cardholder first |
| 3 | `POST /card/holder/v2/create` | Create cardholder (B2B or B2C based on `metadata.cardHolderModel`) |
| 4 | `POST /card/v2/openCard` | Create card with `holderId` + initial `amount` |
| 5 | `POST /card/info` | Query card info (status, balance) |
| 6 | `POST /card/info/sensitive` | Get encrypted card number, CVV, expiry |
Monitor cardholder approval via [Cardholder List](/paas/fincard-virtual/card-holders) or [Webhooks](/paas/fincard-virtual/webhooks). Proceed to card creation only when `status=pass_audit`.
---
## 2. Physical Card
Physical cards are purchased offline in bulk, then assigned and activated via API.
```mermaid
flowchart TD
S(( )) --> PurchaseOffline[PurchaseOffline]
PurchaseOffline --> GetCardBIN[GetCardBIN]
GetCardBIN --> CreateHolder[CreateHolder]
CreateHolder --> AssignCard[AssignCard]
AssignCard -->|webhook| ReceiveCode[ReceiveCode]
ReceiveCode --> ActivateCard[ActivateCard]
ActivateCard --> GetSensitive[GetSensitive]
GetSensitive --> E([Ready to use])
```
| Step | API | Description |
|------|-----|-------------|
| 1 | — | Customer purchases physical cards offline from BD |
| 2 | `POST /card/v2/cardTypes` | Get BIN config. Filter `type=Physical` |
| 3 | `POST /card/holder/v2/create` | Create cardholder (if `needCardHolder=true`) |
| 4 | `POST /card/v2/openCard` | Create card with `cardNumber` (from physical card) |
| 5 | Webhook: `activation_code` | Receive activation code via webhook or cardholder email |
| 6 | `POST /card/activate` | Activate with `pin` (6 digits) + `activeCode` |
| 7 | `POST /card/info/sensitive` | Get card number, CVV, expiry (available after activation) |
Before activation, `card/info/sensitive` returns limited data. Full card details (number, CVV, expiry) are only available after successful activation.
---
## 3. Shared Card (BUDGET_CARD)
Multiple cards share the same wallet. Deposit = allocate credit limit, Withdraw = reduce credit limit.
```mermaid
flowchart TD
S(( )) --> GetCardBIN[GetCardBIN]
GetCardBIN --> CreateHolder[CreateHolder]
CreateHolder --> CreateAccount[CreateAccount]
CreateAccount --> FundAccount[FundAccount]
FundAccount --> CreateCard1[CreateCard 1]
FundAccount --> CreateCard2[CreateCard 2]
CreateCard1 --> AllocateCredit[AllocateCredit]
CreateCard2 --> AllocateCredit
AllocateCredit --> E([Cards ready])
```
| Step | API | Description |
|------|-----|-------------|
| 1 | `POST /card/v2/cardTypes` | Get BIN config. Filter `mode=BUDGET_CARD` |
| 2 | `POST /card/holder/v2/create` | Create cardholder (if needed) |
| 3 | `POST /account/create` | Create MARGIN account for shared pool |
| 4 | `POST /account/transfer` | Fund MARGIN from WALLET |
| 5-6 | `POST /card/v2/openCard` | Create cards with `accountId` pointing to shared account |
| 7 | `POST /card/deposit` | Top-up = allocate credit limit to each card |
- **Deposit** on a shared card = allocating credit from the shared pool
- **Withdraw** on a shared card = reducing the credit limit
- All cards share the same underlying MARGIN account balance
---
## 4. Gift Card
Gift cards return only a redemption URL. No card number/CVV/expiry. No deposit/withdraw/freeze/unfreeze.
```mermaid
flowchart TD
S(( )) --> GetCardBIN[GetCardBIN]
GetCardBIN --> CreateHolder[CreateHolder]
CreateHolder --> CreateCard[CreateCard]
CreateCard --> GetSensitive[GetSensitive]
GetSensitive --> E([Share URL with recipient])
```
| Step | API | Description |
|------|-----|-------------|
| 1 | `POST /card/v2/cardTypes` | Get BIN config. Filter `category=GIFT` |
| 2 | `POST /card/holder/v2/create` | Create cardholder (if needed) |
| 3 | `POST /card/v2/openCard` | Create gift card with initial amount |
| 4 | `POST /card/info/sensitive` | Returns only `activateUrl` (redemption page) |
### Gift Card Restrictions
| Feature | Supported |
|---------|-----------|
| Card number / CVV / Expiry | **No** — only `activateUrl` |
| Deposit | **No** |
| Withdraw | **No** |
| Freeze / UnFreeze | **No** |
| Cancel | Yes |
| Card Info | Yes (basic status only) |
---
## Flow Comparison
| Feature | Virtual | Physical | Shared | Gift |
|---------|---------|----------|--------|------|
| **Mode** | PREPAID_CARD | PREPAID_CARD | BUDGET_CARD | PREPAID_CARD |
| **Type** | Virtual | Physical | Virtual | Virtual |
| **Category** | PURCHASE/SUBSCRIPTION | PHYSICAL | PURCHASE | GIFT |
| **Cardholder** | Optional | Optional | Optional | Optional |
| **Card Number Input** | No | Yes (offline) | No | No |
| **Activation** | Auto | Manual (PIN + code) | Auto | Auto |
| **Shared Account** | No | No | Yes (MARGIN) | No |
| **Deposit/Withdraw** | Yes | Yes | Yes (credit allocation) | No |
| **Freeze/UnFreeze** | Yes | Yes | Yes | No |
| **Sensitive Info** | Full | After activation | Full | Only `activateUrl` |