Cards: Virtual & Physical
This page covers everything about the Card object: the two independent status dimensions every card has, how virtual and physical issuance differ, activation, sensitive-data handling, PIN management, and how transaction limits cascade from Program to Cardholder to Card.
Only Cardholders with
status = 1(Approved) — see Cardholders & the Compliance Lifecycle — can have cards issued to them.
Virtual vs. physical, at a glance
| Virtual | Physical | |
|---|---|---|
| Issuance endpoint | POST /cards/virtual/{cardholderId} | POST /cards/assign/{cardholderId} |
| Required fields | nameOnCard | nameOnCard, cardType |
| Ready to use immediately? | Yes — issuerCardStatus = 1 (Active) on issuance | No — issuerCardStatus = 4 (Not Activated) until activated |
| Activation required? | No | Yes — PUT /cards/{cardId}/activate |
Card design selection (cardType)? | Not applicable | Yes — selects one of the Program's 6 design slots |
| Deposit addresses generated at issuance? | Yes | Yes |
Two independent status dimensions
Every card has two separate status fields that are easy to conflate but represent different things:
cardStatus— the approval status of the issuance request itselfissuerCardStatus— the card's operational lifecycle after approval
cardStatus — approval
cardStatus — approvalcardStatus | Meaning |
|---|---|
0 | Pending |
1 | Approved |
2 | Declined |
stateDiagram-v2
[*] --> Pending: Card issuance requested
Pending --> Approved
Pending --> Declined
Approved --> [*]
Declined --> [*]
issuerCardStatus — operational lifecycle
issuerCardStatus — operational lifecycleissuerCardStatus | Meaning |
|---|---|
0 | Pending |
1 | Active |
2 | On Hold |
3 | Closed |
4 | Not Activated |
stateDiagram-v2
[*] --> NotActivated: Physical card approved
[*] --> Active: Virtual card approved
NotActivated --> Active: PUT /cards/{cardId}/activate
Active --> OnHold: PUT /cards/{cardId}/status — newStatus 2
OnHold --> Active: PUT /cards/{cardId}/status — newStatus 1
Active --> Closed
OnHold --> Closed
Closed --> [*]
Putting them together
cardStatus | issuerCardStatus | What it means |
|---|---|---|
0 Pending | — | Issuance request awaiting approval; no card exists yet |
2 Declined | — | Issuance request declined; no card was created |
1 Approved | 4 Not Activated | Physical card approved and issued, awaiting cardholder activation |
1 Approved | 1 Active | Card ready to use — virtual immediately, or physical after activation |
1 Approved | 2 On Hold | Card temporarily blocked from transacting |
1 Approved | 3 Closed | Card permanently closed |
GET /cards(the list endpoint) returns a singlestatusfield per card, using the same 0–4 values asissuerCardStatus.GET /cards/{cardId}(the detail endpoint) returns bothcardStatusandissuerCardStatusseparately.PUT /cards/{cardId}/statusonly acceptsnewStatusvalues1(Active) or2(On Hold) —3(Closed) and4(Not Activated) aren't reachable through this endpoint.
Issuing a virtual card
POST /cards/virtual/{cardholderId}
| Field | Required | Description |
|---|---|---|
nameOnCard | Yes | Name to appear on the virtual card (1–26 characters) |
alias | No | A localized system alias to help distinguish between a cardholder's cards |
transactionLimit | No | Card-level spending ceiling (decimal-implied); inherits the Cardholder's limit if unset |
callingCode, countryCallingCode, phoneNum, cellNum, emailAdr | No | Card-specific contact details — see "The contact object" below |
Issuing a physical card
POST /cards/assign/{cardholderId}
| Field | Required | Description |
|---|---|---|
nameOnCard | Yes | Name to appear on the physical card during personalization (1–26 characters) |
cardType | Yes | 0–5 — selects a Card Design slot (see Card Programs & Designs). 0 is the Program's default design. |
alias, transactionLimit, contact fields | No | Same as virtual |
The issuance response
Both issuance endpoints return a CardCreateResponse:
| Field | Description |
|---|---|
status | success | error |
cardId | The new card's unique ID |
type | physical | virtual |
maskedCardNumber | The PAN, masked to the last 4 digits |
cryptoAddresses | Generated immediately, even before a physical card is activated — see Funding & Deposits |
Deposit addresses exist from the moment a card is issued — a physical card can receive digital-asset deposits before it's ever activated. Activation governs the card's ability to be used for point-of-sale/online spending and PIN-based transactions, not whether it can receive funds.
Activation (physical cards only)
PUT /cards/{cardId}/activate
| Field | Required | Description |
|---|---|---|
cardNumber | Yes | The card's 16-digit PAN |
expMonth | Yes | Expiry month (MM) |
expYear | Yes | Expiry year |
cvv | Yes | The card's CVV/CVC |
newPin | Yes | A new 4-digit PIN |
This is the standard "enter the details printed on your card, plus choose a PIN" activation pattern — the cardholder provides the PAN/expiry/CVV from the physical card they received as proof of possession, while simultaneously setting their PIN.
The response (ActivationResponse) confirms newStatus = 1 (Active).
Activation is a one-way transition — there's no "deactivate" or "return to Not Activated" operation. To temporarily block a card after activation, use
PUT /cards/{cardId}/statuswithnewStatus = 2(On Hold) instead.
Retrieving card data
| Endpoint | Returns | Sensitivity |
|---|---|---|
GET /cards | List of cards (maskedCardNumber, status, cardholderId, names, createdDatetime) | Low — safe for general listing UIs |
GET /cards/{cardId} | Full CardViewMasked — cardStatus, issuerCardStatus, alias, maskedCardNumber, transactionLimit, cryptoAddresses, contact, type | Low |
GET /cards/{cardId}/details | CardDetailsMasked — full unmasked cardNumber, expMonth, expYear, cvv, plus cryptoAddresses | Critical |
GET /cards/{cardId}/status | Current status fields only | Low |
GET /cards/{cardId}/balance | ledgerBalance, availableBalance, currency — see Accounts, Wallets & Deposit Addresses | Low |
GET /cards/{cardId}/detailsreturns the complete PAN and CVV in plaintext, despite "Masked" in its schema name (CardDetailsMasked) — this naming does not reflect the actual response content. The full PAN and CVV are only exposed once the cardholder is compliance-approved (status = 1). Treat this endpoint as returning the most sensitive data available through this API:
- Call it only when displaying full card details to the cardholder themselves (e.g. for manual entry into a digital wallet), and over connections/UIs that meet PCI-DSS requirements for PAN/CVV display.
- Never log the response.
- Never persist
cardNumberorcvvin your own systems beyond the immediate use case.- See Security Compliance & Data Protection.
PIN management
PUT /cards/{cardId}/pin
Requires both oldPIN and newPIN — this is a change operation, not a reset. (The initial PIN is set during activation via newPin on the activate call above; virtual cards, which have no PIN-based point-of-sale use, may not require this at all.)
Updating card details
PUT /cards/{cardId}/update
| Field | Description |
|---|---|
alias | Update the card's display alias |
transactionLimit | Update the card-level spending ceiling (decimal-implied, capped by the Cardholder's limit) |
callingCode, countryCallingCode, phoneNum, cellNum, emailAdr | Update card-specific contact details |
The contact object
contact objectEach card carries its own optional contact object (calling code, phone numbers, email) — used, for example, as the delivery target for card-specific notifications. If not set, it defaults to the Cardholder's contact details. This is useful for corporate use cases where a shared corporate card might route notifications to a different contact than the individual Cardholder's personal details — see Program Architecture: Corporate use cases.
Transaction limit inheritance
transactionLimit cascades from Program → Cardholder → Card, with each level optional and capped by the level above:
flowchart TD
P["Program transactionLimit<br/>(ceiling — cannot be exceeded by anything below)"]
CH["Cardholder transactionLimit<br/>(optional — if unset, inherits Program's)"]
C["Card transactionLimit<br/>(optional — if unset, inherits Cardholder's)"]
P --> CH --> C
A Card's effective transaction limit is therefore the most specific limit set, falling back up the chain — but never exceeding the Program's ceiling, regardless of what's configured at the Cardholder or Card level.
