Data Model & Object Reference

This page provides the full data model: an entity relationship (ER) diagram showing every object and its relationships, followed by a field-level reference table for each object.


Entity relationship diagram

erDiagram
    TENANT ||--o{ PROGRAM : "creates and manages"
    TENANT ||--o{ API_USER : "manages"
    TENANT ||--o{ SUPPORT_TICKET : "raises"
    PROGRAM ||--o{ CARDHOLDER : "onboards"
    PROGRAM ||--o{ CARD_DESIGN_SLOT : "configures (0-5)"
    PROGRAM ||--o{ WALLET : "provisions"
    CARDHOLDER ||--|| CARDHOLDER_ACCOUNT : "has one"
    CARDHOLDER ||--o{ CARD : "holds"
    CARDHOLDER ||--o{ KYC_DOCUMENT : "submits"
    CARD ||--|| CARD_ACCOUNT : "has one"
    CARD ||--o{ DEPOSIT_ADDRESS : "provisioned at issuance"
    CARD ||--o{ OTP_LISTENER : "may have"
    CARD_ACCOUNT ||--o{ TRANSACTION : "records"
    CARD_ACCOUNT ||--o{ FEE : "incurs"
    CARD_DESIGN_SLOT ||--o{ CARD : "selected via cardType"
    WALLET ||--o{ WALLET_TRANSACTION : "records"
    WALLET }o--o{ CARD_ACCOUNT : "transfers to"
 
    TENANT {
        string legalEntityName "cert O field"
        string tradingName "cert OU field"
    }
    PROGRAM {
        int currency "0 USD 1 CAD 2 GBP 3 EUR"
        int transactionLimit "ceiling - inherited"
        boolean threeDSEnabled
    }
    CARDHOLDER {
        int cardholderId PK
        int status "0-7"
        int transactionLimit
        int sumsubEnabled "0 or 1"
        string emailAdr
        string applicationLink
        string dateCreated
    }
    CARD {
        int cardId PK
        int cardholderId FK
        string cardVariant "physical or virtual"
        int cardStatus "0-2"
        int issuerCardStatus "0-4"
        int transactionLimit
        int cardType "0-5"
        string alias
        string maskedCardNumber
    }
    WALLET {
        int walletId PK
        string name
        int walletCurrencyId
        boolean isActive
        boolean isDeleted
        string dateCreated
    }
    CARD_ACCOUNT {
        int ledgerBalance
        int availableBalance
        int currency
    }
    DEPOSIT_ADDRESS {
        string chain
        string address
    }
    TRANSACTION {
        string transId PK
        string authRefNum
        string amount
        int transStatus "1-5"
        int transType
        string merchantName
        string merchantCurrency
        string merchantAmount
        string dateCreated
        string dateSettled
    }
    FEE {
        string feeId PK
        string authRefNum
        string amount
        int transStatus "1-5"
        int feeType
        string dateCreated
        string dateSettled
    }
    OTP_LISTENER {
        string token PK
        int expiresAt "currently null"
    }
    CARD_DESIGN_SLOT {
        int slot "0-5"
        int status "0-2"
    }
    API_USER {
        string id
    }
    SUPPORT_TICKET {
        string ticketId PK
        string status
        int priority "1-5"
        string programId
        int cardholderId
        int cardId
    }
📘

Wallet-to-wallet transfers (POST /wallets/transfer with destinationType = 0) are not shown as a self-referential relationship in the diagram above. The WALLET }o--o{ CARD_ACCOUNT line represents wallet-to-card transfers; the same transfer endpoint also supports wallet-to-wallet, with destinationId referencing another wallet. See Transfer Internal Fiat Funds.


Object field reference

Cardholder

Created via POST /cardholders. Retrieved via GET /cardholders/{cardholderId} (CardholderView).

Identity & compliance (locked once status = 3 or 1)

FieldTypeConstraintsNotes
firstNamestring2–50 charsLegal first name as on government-issued ID
midNamestringmax 50 charsOptional legal middle name
lastNamestring2–50 charsLegal last name as on government-issued ID
genderinteger enum0/1/2See Statuses & Enums
nationalitystring2–50 charsAs on government-issued ID
placeOfBirthstring3 charsISO 3166-1 Alpha-3 country code (e.g. USA)
dobstringYYYY-MM-DDLegal date of birth as on government-issued ID
adrLine1string4–50 charsFirst line of residential address as on proof of address
adrLine2stringmax 50 charsOptional second address line
citystring2–50 charsCity as on proof of address
statestring2–50 charsState/equivalent. US: 2-letter USPS abbrev. Non-applicable: XX
countrystring2 chars, Alpha-2ISO 3166-1 Alpha-2 (e.g. US)
zipCodestring5–12 charsZIP/postal code. Non-applicable: 00000
sumsubEnabledinteger enum0/1KYC provider selection — locked once Under Review

Contact (always editable)

FieldTypeConstraintsNotes
emailAdrstring6–50 chars
callingCodestring3 digitsITU dialing code, zero-padded to 3 digits (e.g. 001)
cellNumstring10–20 digitsMobile number; dialing code in callingCode
countryCallingCodestring2 chars, Alpha-2Alpha-2 country code associated with phoneNum (not a dialing code)
phoneNumstring10–20 digitsLandline; dialing code in countryCallingCode

Card personalization & optional

FieldTypeConstraintsNotes
cardHolderFirstNamestringmax 50 charsPreferred name on cards — defaults to firstName
cardHolderLastNamestringmax 50 charsPreferred name on cards — defaults to lastName
employeeIDstringOptional corporate identifier
transactionLimitintegerdecimal-implied integerPer-transaction spending ceiling — capped by Program

System-generated (read-only)

FieldTypeNotes
cardholderIdintegerPrimary key, auto-generated
statusinteger enum0–7 — see Statuses & Enums
applicationLinkstringDidit KYC URL — returned on CardholderView after submission
dateCreatedstringUnix timestamp (seconds)
kycDocsarraySee KYC Document object below

KYC document (kycDocsView)

Returned as array kycDocs on CardholderView.

FieldTypeNotes
kycDocIDintegerDocument record ID
statusintegerDocument-level review status
docTypeintegerDocument type
langstringDocument language
numberstringDocument number
issueBystringIssuing authority
issuerDatestringDate of issue
expireDatestringExpiry date
image_FrontExtstringFile extension of the front-face image
image_BackExtstringFile extension of the reverse-face image

Card (CardViewMasked)

Retrieved via GET /cards/{cardId}. Also returned as CardListItem in list responses.

FieldTypeNotes
cardIdintegerPrimary key
cardholderIdintegerOwner cardholder
typestringphysical or virtual
cardStatusinteger enum0–2 — approval status (see Statuses & Enums)
issuerCardStatusinteger enum0–4 — operational status (see Statuses & Enums)
maskCardNumberstringPAN masked to last 4 digits (****1234)
transactionLimitintegerdecimal-implied integer card-level spending ceiling
cardTypeinteger0–5 — card design slot selected at issuance
aliasstringDisplay alias
cryptoAddressesarray[{ chain, address }] — Deposit Addresses generated at issuance
contactobjectCard-level contact details (defaults to cardholder's)
createdDatetimestringTimestamp of issuance

Card sensitive details GET /cards/{cardId}/details

❗️

The full unmasked PAN and CVV/CVC are only returned once the Cardholder is compliance-approved (status = 1). Never log a Card's full PAN or CVV/CVC. See Issue a Virtual Card.

FieldTypeNotes
cardIdinteger
cardholderIdinteger
cardNumberstringFull unmasked PAN
expMonthstringExpiry month (MM)
expYearstringExpiry year
cvvstringCVV/CVC
cryptoAddressesarrayDeposit Addresses

Card balance GET /cards/{cardId}/balance

FieldTypeNotes
ledgerBalanceintegerdecimal-implied integer — includes pending amounts
availableBalanceintegerdecimal-implied integer — fully cleared and spendable
currencyinteger enum0–3 — see Statuses & Enums

Wallet (WalletView)

FieldTypeNotes
walletIdintegerPrimary key
namestringDisplay name
walletCurrencyIdinteger enum0–3 — see Statuses & Enums
isActivebooleanWhether the wallet is active
isDeletedbooleanWhether the wallet has been deleted
dateCreatedstringCreation timestamp
dateLastModifiedstringLast modification timestamp
🚧

WalletView does not include ledgerBalance or availableBalance. Wallet balance must be inferred from transaction history — see Create & Manage Wallets.


Transaction (TransactionsViewResponse)

FieldTypeNotes
cardIdinteger
transIdstringPrimary key
authRefNumstringAuthorization reference — use to correlate with fee records
amountstringAmount in Card's base currency — see Transactions & Fees
descriptionstring
dateCreatedstring
dateSettledstring
transTypeintegerTransaction type — see Statuses & Enums
transStatusinteger enum1–5 — see Statuses & Enums
merchantNamestring
merchantCurrencystringCurrency as presented by Merchant — may equal Card base currency even for foreign transactions
merchantAmountstringAmount in Merchant's currency — see Transactions & Fees

Fee (FeesViewResponse)

Same structure as Transaction with feeId instead of transId and feeType instead of transType:

FieldTypeNotes
cardIdinteger
feeIdstringPrimary key
authRefNumstringLinks to associated transaction — may be absent for standalone fees
amountstringNote: string type, not an integer as elsewhere
descriptionstring
dateCreatedstring
dateSettledstring
feeTypeintegerFee type
transStatusinteger enum1–5 — same enum as Transaction status
merchantNamestring
merchantCurrencystring
merchantAmountstringNote: string type, not an integer as elsewhere

OTP Listener

Created via POST /otp/listeners. Retrieved via GET /otp/{token}.

FieldObjectTypeNotes
tokenCreate responsestringOpaque OTP subscription identifier — treat as credential
expiresAtCreate responseintegerCurrently always null
statusRetrieve responsestring enumpending/received/expired/consumed
codeRetrieve responsestringOTP code — present only when status = received
receivedAtRetrieve responseintegerUnix timestamp when OTP was generated
expiresAtRetrieve responseintegerEnforced expiry — Unix timestamp, different from subscription expiresAt

Transfer response

Returned by POST /wallets/transfer.

FieldTypeNotes
transIdintegerTransaction ID for this transfer
transStatusinteger enum0–4 — different enum from Transaction/Fee transStatus — see Statuses & Enums