Module 4: Issuing a Card

🧠 Learning Objectives

By the end of this module, you’ll be able to:

Understand how virtual cards are issued technically and operationally

Know what triggers card creation — and what dependencies must be in place

Write or spec the API request to issue a card

Design the right experience around card creation success or failure

Prevent the most common integration mistakes

What Does “Issuing a Card” Actually Mean?

To “issue” a virtual card means to:

Allocate a new, unique card number (PAN), expiry, and CVV

Link that card to a registered user (from Module 3)

Create a backend record with spend, funding, and transaction limits

Activate the card and return it to your app via API

Enable the card for use online under a payment scheme (e.g., Visa, Verve)

This process happens within seconds — but it relies on years of network and issuer infrastructure behind the scenes.

When Should You Issue a Card?

Virtual card issuance can be triggered by:

ScenarioExample
On user signupIssue a card by default to every verified user
After first depositWait until they fund their wallet or complete KYC
On requestLet users tap "Create Card" manually
Programmatic logicAuto-create cards based on payout, spend, or budget triggers
Event-based systemse.g. Issue a card for each influencer campaign

🔐 Requirements Before You Issue

To successfully issue a card, you must:

Have already registered the card user (see Module 3)

Have stored their card_user_id

Be under your card issuance quota (e.g., 2 active cards per user)

Pass a valid reference and other metadata with the request

🧾 Sample Card Issuance API Request

Request Body
FieldRequiredDescription
referenceThe user’s registered reference (must match registered user)
labelOptionalName to show in the app (e.g., “Marketing Card”)
currencyOptionalDefaults to USD (or required if multi-currency is supported)
Response (Success)

Note: PAN, CVV, and expiry are only shown once. Display securely or store encrypted if required.

Response (Failure)

💡 UX Tip: Displaying Card Details

FieldShow In App?Why
PAN (card number)✅ Securely, onceUsers need this to pay
ExpiryRequired for most merchants
CVV✅ OnceOften needed to verify online
Cardholder nameOptionalCan be “Virtual Card” or user’s name
Card statusShow "Active", "Frozen", or "Terminated" clearly

Display warning: Let users know they can’t recover card details later. If lost, they must terminate and create a new one.

🧃 What Happens Behind the Scenes

Your API call goes to your platform (or Bitnob if integrated)

Your platform contacts the card processor (e.g. Interswitch, Marqeta)

A unique PAN, expiry, and CVV are allocated

The card is linked to your registered user

The card is marked active and can be used immediately

You receive card metadata (masked or full)

This flow is usually invisible to the user — it just feels instant.

🧱 Quotas and Limits to Be Aware Of

LimitTypical Value
Max cards per user2 (some platforms may allow more)
Card creation rateThrottled to prevent abuse (e.g. 5 per minute)
Label character limitUsually 32 or fewer

Exceeding these may result in silent errors or failed API responses.

🧪 Common Mistakes to Avoid

MistakeOutcome
Issuing a card before registering the userFails with vague error
Using the same reference twice without cleanupConflicts in card-user mapping
Not storing the card IDYou’ll lose the ability to top-up, track, or manage the card
Showing CVV after initial API callViolates scheme and processor compliance rules

🧪 Recap Quiz

1.

Can a card be issued before a user is registered?

2.

Are PAN and CVV reusable after the API response?

3.

Is the card active immediately after it’s created?

4.

What field links your system user to the virtual card record?

Answers:

1.

No

2.

No

3.

Yes

4.

reference

✅ Key Takeaways

Virtual card issuance is fast, but must be done after user registration

You’ll receive the card details only once — design your UI accordingly

Displaying card status and limits clearly builds trust

Store the card ID securely for future operations (top-up, freeze, etc.)

Always catch errors and webhook events for lifecycle changes

Did you find this page useful?