Skip to main content

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 response.

Cardholder Occupations

List available occupation codes for B2C cardholder creation.
POST /api/v2.1/fincard/virtual/card/holder/occupations
Request: {} (empty body) Response data[]:
FieldTypeDescription
occupationCodeStringOccupation code (e.g. 11-1011)
descriptionStringOccupation description (e.g. Chief Executives)

Create Cardholder V2

Create a new KYC-verified cardholder. Fields differ based on cardHolderModel.
POST /api/v2.1/fincard/virtual/card/holder/v2/create

B2B Model Request

FieldTypeRequiredDescription
cardHolderModelStringYesB2B
merchantOrderNoStringYesClient tx ID [20..40]
cardTypeIdLongYesCard type ID
areaCodeStringYesMobile area code [2..5] (from supportHolderAreaCode)
mobileStringYesMobile number [5..20]
emailStringYesEmail [5..50] (receives verification codes)
firstNameStringYesFirst name (English only) [2..32]
lastNameStringYesLast name (English only) [2..32]
birthdayStringYesDate of birth yyyy-MM-dd
countryStringYesBill address country (ISO alpha-2, from supportHolderRegin)
townStringYesBill address city code (from City List)
addressStringYesBill address [2..40] (letters, numbers, hyphens, spaces)
postCodeStringYesPostal code [2..15]
Total length of firstName + lastName cannot exceed 32 characters (including spaces).

B2C Model Request (additional fields)

All B2B fields plus:
FieldTypeRequiredDescription
nationalityStringYesISO alpha-2 (from supportHolderRegin)
genderStringYesM (male) / F (female)
occupationStringYesOccupation code (from Occupations)
annualSalaryStringYese.g. 100000 USD
accountPurposeStringYesEnglish only (e.g. Living Expense)
expectedMonthlyVolumeStringYese.g. 10000 USD
idTypeStringYesPASSPORT / HK_HKID / DLN / GOVERNMENT_ISSUED_ID_CARD
idNumberStringYesID number [2..50]
issueDateStringYesID issue date yyyy-MM-dd
idNoExpiryDateStringYesID expiry date yyyy-MM-dd
idFrontIdStringYesFront photo file ID (from Upload File)
idBackIdStringYesBack photo file ID
idHoldIdStringYesSelfie photo file ID
ipAddressStringYesIPv4 address

ID Types by Region

RegionSupported ID Types
Hong KongPASSPORT, HK_HKID
All otherPASSPORT, 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

FieldTypeDescription
holderIdLongCardholder ID (use in create card)
merchantOrderNoStringClient tx ID
cardTypeIdLongCard type ID
statusFlowLocationStringadmin (platform review) / channel (bank review)
statusStringwait_audit / pass_audit / under_review / reject
descriptionStringStatus 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.
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.
POST /api/v2.1/fincard/virtual/card/holder/list
Request:
FieldTypeRequiredDescription
pageNumIntegerYesPage number (default 1)
pageSizeIntegerYesPage size (max 100, default 10)
holderIdLongNoFilter by holder ID
areaCodeStringNoFilter by area code (requires mobile too)
mobileStringNoFilter by mobile
emailStringNoFilter by email
merchantOrderNoStringNoFilter by client tx ID
Response data: { total, records[] }
FieldTypeDescription
holderIdStringCardholder ID
merchantOrderNoStringClient tx ID
cardTypeIdStringCard type ID
areaCodeStringMobile area code
mobileStringMobile number
emailStringEmail
firstNameStringFirst name
lastNameStringLast name
birthdayStringDate of birth
countryStringCountry
townStringCity code
addressStringAddress
postCodeStringPostal code
statusFlowLocationStringadmin / channel
statusStringwait_audit / pass_audit / under_review / reject
descriptionStringStatus description
createTimeLongCreation time (ms)
updateTimeLongUpdate time (ms)

Deprecated Endpoints

The following V1 endpoints are still available but deprecated:
EndpointPathReplacement
Create V1/card/holder/createUse /card/holder/v2/create
Update V1/card/holder/updateUse /card/holder/v2/update