URL: /paas/fincard-virtual/card-holders
---
title: 'Card Holders'
description: 'KYC cardholder creation, update, approval tracking, and listing'
---
# Card Holder APIs
Manage KYC-verified cardholders. Required when card type has `needCardHolder=true`. Supports B2B (simplified) and B2C (full KYC with ID documents) models.
**Base URL:** `POST /api/v2.1/fincard/virtual/card/holder/...`
The `cardHolderModel` values `B2B` and `B2C` are **internal codes** — they do NOT correspond to company vs individual. Check the `metadata.cardHolderModel` field from the [Card Types](/paas/fincard-virtual/cards) response.
---
## Cardholder Occupations
List available occupation codes for B2C cardholder creation.
```bash
POST /api/v2.1/fincard/virtual/card/holder/occupations
```
**Request:** `{}` (empty body)
**Response `data[]`:**
| Field | Type | Description |
|-------|------|-------------|
| `occupationCode` | String | Occupation code (e.g. `11-1011`) |
| `description` | String | Occupation description (e.g. `Chief Executives`) |
---
## Create Cardholder V2
Create a new KYC-verified cardholder. Fields differ based on `cardHolderModel`.
```bash
POST /api/v2.1/fincard/virtual/card/holder/v2/create
```
### B2B Model Request
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `cardHolderModel` | String | Yes | `B2B` |
| `merchantOrderNo` | String | Yes | Client tx ID `[20..40]` |
| `cardTypeId` | Long | Yes | Card type ID |
| `areaCode` | String | Yes | Mobile area code `[2..5]` (from `supportHolderAreaCode`) |
| `mobile` | String | Yes | Mobile number `[5..20]` |
| `email` | String | Yes | Email `[5..50]` (receives verification codes) |
| `firstName` | String | Yes | First name (English only) `[2..32]` |
| `lastName` | String | Yes | Last name (English only) `[2..32]` |
| `birthday` | String | Yes | Date of birth `yyyy-MM-dd` |
| `country` | String | Yes | Bill address country (ISO alpha-2, from `supportHolderRegin`) |
| `town` | String | Yes | Bill address city code (from [City List](/paas/fincard-virtual/common)) |
| `address` | String | Yes | Bill address `[2..40]` (letters, numbers, hyphens, spaces) |
| `postCode` | String | Yes | Postal code `[2..15]` |
Total length of `firstName` + `lastName` cannot exceed 32 characters (including spaces).
### B2C Model Request (additional fields)
All B2B fields plus:
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `nationality` | String | Yes | ISO alpha-2 (from `supportHolderRegin`) |
| `gender` | String | Yes | `M` (male) / `F` (female) |
| `occupation` | String | Yes | Occupation code (from [Occupations](#cardholder-occupations)) |
| `annualSalary` | String | Yes | e.g. `100000 USD` |
| `accountPurpose` | String | Yes | English only (e.g. `Living Expense`) |
| `expectedMonthlyVolume` | String | Yes | e.g. `10000 USD` |
| `idType` | String | Yes | `PASSPORT` / `HK_HKID` / `DLN` / `GOVERNMENT_ISSUED_ID_CARD` |
| `idNumber` | String | Yes | ID number `[2..50]` |
| `issueDate` | String | Yes | ID issue date `yyyy-MM-dd` |
| `idNoExpiryDate` | String | Yes | ID expiry date `yyyy-MM-dd` |
| `idFrontId` | String | Yes | Front photo file ID (from [Upload File](/paas/fincard-virtual/common)) |
| `idBackId` | String | Yes | Back photo file ID |
| `idHoldId` | String | Yes | Selfie photo file ID |
| `ipAddress` | String | Yes | IPv4 address |
### ID Types by Region
| Region | Supported ID Types |
|--------|--------------------|
| **Hong Kong** | `PASSPORT`, `HK_HKID` |
| **All other** | `PASSPORT`, `DLN`, `GOVERNMENT_ISSUED_ID_CARD` |
### Restricted Countries/Regions
Cuba, North Korea, Egypt, Iran, Myanmar, Nigeria, Russia, Belarus, South Africa, Syria, Ukraine, Venezuela, Sudan, South Sudan, Libya, Crimea, Burundi, Central African Republic, Somalia, Zimbabwe, Afghanistan.
### Response `data`
| Field | Type | Description |
|-------|------|-------------|
| `holderId` | Long | **Cardholder ID** (use in create card) |
| `merchantOrderNo` | String | Client tx ID |
| `cardTypeId` | Long | Card type ID |
| `statusFlowLocation` | String | `admin` (platform review) / `channel` (bank review) |
| `status` | String | `wait_audit` / `pass_audit` / `under_review` / `reject` |
| `description` | String | Status description |
Approval flow: **admin** review first → then **channel** (bank) review. Cardholder can only be used for card creation when `status=pass_audit`.
---
## Update Cardholder V2
Update a rejected cardholder. Only allowed when `statusFlowLocation=admin` AND `status=reject`.
```bash
POST /api/v2.1/fincard/virtual/card/holder/v2/update
```
**Request:** Same fields as Create + `holderId` (required). All fields are re-submitted.
**Response:** Same as Create response.
Cardholder information **cannot be modified after bank submission**. Email and ID number are **globally unique** per card type — duplicates are rejected.
---
## Cardholder List
Query cardholders with pagination and filters.
```bash
POST /api/v2.1/fincard/virtual/card/holder/list
```
**Request:**
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `pageNum` | Integer | Yes | Page number (default 1) |
| `pageSize` | Integer | Yes | Page size (max 100, default 10) |
| `holderId` | Long | No | Filter by holder ID |
| `areaCode` | String | No | Filter by area code (requires `mobile` too) |
| `mobile` | String | No | Filter by mobile |
| `email` | String | No | Filter by email |
| `merchantOrderNo` | String | No | Filter by client tx ID |
**Response `data`:** `{ total, records[] }`
| Field | Type | Description |
|-------|------|-------------|
| `holderId` | String | Cardholder ID |
| `merchantOrderNo` | String | Client tx ID |
| `cardTypeId` | String | Card type ID |
| `areaCode` | String | Mobile area code |
| `mobile` | String | Mobile number |
| `email` | String | Email |
| `firstName` | String | First name |
| `lastName` | String | Last name |
| `birthday` | String | Date of birth |
| `country` | String | Country |
| `town` | String | City code |
| `address` | String | Address |
| `postCode` | String | Postal code |
| `statusFlowLocation` | String | `admin` / `channel` |
| `status` | String | `wait_audit` / `pass_audit` / `under_review` / `reject` |
| `description` | String | Status description |
| `createTime` | Long | Creation time (ms) |
| `updateTime` | Long | Update time (ms) |
---
## Deprecated Endpoints
The following V1 endpoints are still available but deprecated:
| Endpoint | Path | Replacement |
|----------|------|-------------|
| Create V1 | `/card/holder/create` | Use `/card/holder/v2/create` |
| Update V1 | `/card/holder/update` | Use `/card/holder/v2/update` |