cardType: SINGLE_USE parameter. cardType is a response field, not an input. You get single-use behavior by setting lockCardNextUse: true when you issue the card.
Issue the card
Restricted Access
This mutation requires a Bearer token with the
CREATE_VIRTUALCARD scope.lockCardNextUse: true on createVirtualCard. Everything else about the request is a normal card issuance.
The relevant fields
cardType in the response is not a reliable single-use indicator. Read back the card’s lockCardNextUse setting rather than inferring one-time behavior from cardType, which reflects the card program rather than this setting.Making it stick
lockCardNextUse on its own is reversible. For payout and disbursement flows where a second charge would be a real loss, stack the controls — each one fails closed independently:
1
Size the spend limit to the charge
Set
spendLimit to the exact expected amount, with spendLimitDuration: LIFETIME so it never refreshes. Even if the card is unlocked, there is no headroom left to spend against.2
Set a near-term lockDate
A card issued for a payout that should clear within a week does not need to stay open for 47 months.
lockDate locks the card on that date whether or not it was ever used, which also cleans up abandoned cards.3
Restrict the funding composition
Set
usePrepaymentBalance: false and useRewardsBalance: false so the card draws only from the userCashBalanceId you nominate, rather than reaching into prepaid or rewards balances.4
Reconcile against the ledger
Do not treat issuance as completion. Confirm the charge landed with
getVirtualCardTransactions before marking the payout settled in your own system.Converting an existing card
lockCardNextUse is also editable after issuance through editVirtualCard, so you can retire a multi-use card by letting its next transaction be its last.
lockVirtualCard instead — that takes effect at once and does not wait for a transaction.
Issuing in bulk
lockCardNextUse is available per order item on createVirtualCardBulkOrder, which is the right call for batch disbursements rather than looping createVirtualCard.
getVirtualCardBulkOrderStatus and handle partial failures — an order can complete with fewer cards than requested.
Edge cases
These are the situations where “one transaction” turns out to be ambiguous. Design for them before you ship a payout flow.Locked is not deleted. Virtual cards cannot be deleted. A locked card stays visible and queryable on the account indefinitely, with its transaction history intact. Plan for accumulation if you are issuing single-use cards at volume, and use
cardNickname and transactionCategory at issuance so they remain reconcilable later.Common mistakes
Passing cardType: SINGLE_USE to createVirtualCard
Passing cardType: SINGLE_USE to createVirtualCard
CreateVirtualCardInput has no cardType field — the request fails with ARG-0001. cardType only appears in the response. Set lockCardNextUse: true instead.Treating the lock as irreversible
Treating the lock as irreversible
unlockVirtualCard reopens a locked card, and the card will authorize again if spend headroom remains. If a second charge would be a real loss, constrain spendLimit and lockDate as well rather than relying on the lock alone.Using a refreshing spend limit
Using a refreshing spend limit
spendLimitDuration: DAILY or MONTHLY refreshes the available limit on schedule. On a card that gets unlocked, that restores spending capacity you thought was spent. Use LIFETIME for single-use cards.Marking the payout complete at issuance
Marking the payout complete at issuance
Issuing a card is not the same as money moving. The card may never be used, may be used for less than the limit, or may lock on a verification auth. Reconcile against
getVirtualCardTransactions before closing the payout.Issue Cards
The full
createVirtualCard reference.Create Bulk Order
Issue single-use cards at volume in one asynchronous request.
Lock Virtual Card
Stop a card immediately instead of after its next transaction.
Merchant-Locked Cards
Restrict a card to one merchant instead of one transaction.