The Yativo Card Issuer Program lets businesses issue Visa/Mastercard virtual and physical cards directly to their own customers — under your brand. This guide covers the full setup: applying for issuer status, creating customers, issuing cards, and funding card balances programmatically.
The Issuer Program requires approval from Yativo’s compliance team. Apply using the steps below — approvals typically take 2–5 business days. You can develop and test against the Sandbox at https://crypto-sandbox.yativo.com/api/ while waiting.
Who This Is For
- Fintechs and neobanks building branded card products
- Payroll and expense management platforms
- Crypto exchanges wanting to offer spending cards
- Any business that wants to issue cards to end users
Apply for the issuer program
Submit your business details and intended use case. Yativo’s team will review your application.curl -X POST https://crypto-api.yativo.com/api/card-issuer/apply \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c3JfMDFIWVo..." \
-H "Content-Type: application/json" \
-d '{
"businessName": "Acme Financial Inc.",
"businessType": "fintech",
"website": "https://acmefinancial.com",
"estimatedMonthlyCards": 500,
"useCase": "We provide crypto-funded expense cards to our B2B customers for cross-border payments.",
"contact": {
"name": "James Okafor",
"email": "james@acmefinancial.com",
"phone": "+14085559821"
},
"country": "US",
"incorporationNumber": "7821934-DE"
}'
Response:{
"applicationId": "app_01J2KM3MNPQ7R4S5T6U7VAPP01",
"status": "under_review",
"submittedAt": "2026-03-26T13:00:00Z",
"estimatedReviewDays": 3
}
Wait for approval
Poll the program status endpoint or listen for a card_issuer.application_approved webhook event.curl -X GET https://crypto-api.yativo.com/api/card-issuer/my-program \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c3JfMDFIWVo..."
Approved program response:{
"issuerId": "iss_01J2KN3MNPQ7R4S5T6U7VISSUER",
"status": "approved",
"businessName": "Acme Financial Inc.",
"approvedAt": "2026-03-29T09:00:00Z",
"limits": {
"maxActiveCards": 10000,
"maxMonthlyVolume": "5000000.00",
"currency": "USD"
},
"cardNetworks": ["visa", "mastercard"],
"supportedCardTypes": ["virtual", "physical"]
}
Create customers
Once approved, create customer records for each of your end users. These map to cardholder profiles within your issuer program.curl -X POST https://crypto-api.yativo.com/api/customers/create-customer \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c3JfMDFIWVo..." \
-H "Content-Type: application/json" \
-d '{
"externalId": "your_user_id_8821",
"firstName": "Priya",
"lastName": "Sharma",
"email": "priya@yourapp.com",
"phoneNumber": "+919876543210",
"dateOfBirth": "1992-11-28",
"nationality": "IN",
"address": {
"line1": "42 MG Road",
"city": "Bangalore",
"state": "KA",
"postalCode": "560001",
"country": "IN"
}
}'
Pass your internal user ID as externalId so you can look up the Yativo customer record from your own database without storing the Yativo ID separately.
Create a card for the customer
Issue a card to a specific customer within your issuer program.curl -X POST "https://crypto-api.yativo.com/api/yativo-card/customers/cst_01J2KP3MNPQ7R4S5T6U7VCST55/create-card" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c3JfMDFIWVo..." \
-H "Content-Type: application/json" \
-d '{
"type": "virtual",
"label": "Priya Expense Card",
"currency": "USD",
"spendingLimit": {
"amount": "2000.00",
"interval": "monthly"
}
}'
Fund the customer's card
Top up a customer’s card balance directly from your issuer account’s USDC balance.curl -X POST "https://crypto-api.yativo.com/api/card-issuer/customers/cst_01J2KP3MNPQ7R4S5T6U7VCST55/fund" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c3JfMDFIWVo..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: topup_cst55_20260326_001" \
-d '{
"cardId": "crd_01J2KQ3MNPQ7R4S5T6U7VCRD99",
"amount": "250.00",
"currency": "USD",
"memo": "Monthly expense allowance - March 2026"
}'
Response:{
"fundingId": "fnd_01J2KR3MNPQ7R4S5T6U7VFND12",
"customerId": "cst_01J2KP3MNPQ7R4S5T6U7VCST55",
"cardId": "crd_01J2KQ3MNPQ7R4S5T6U7VCRD99",
"amount": "250.00",
"currency": "USD",
"previousBalance": "0.00",
"newBalance": "250.00",
"status": "completed",
"memo": "Monthly expense allowance - March 2026",
"completedAt": "2026-03-26T13:30:00Z"
}
Monitor with webhooks
Subscribe to card issuer events to keep your platform in sync.const webhook = await client.webhooks.create({
url: "https://api.yourapp.com/webhooks/yativo",
events: [
"card.transaction.approved",
"card.transaction.declined",
"card.funding.completed",
"customer.kyc.approved",
"customer.kyc.rejected",
],
description: "Issuer program events",
});
Relevant events for card issuers:| Event | Trigger |
|---|
card.transaction.approved | A card transaction was authorized |
card.transaction.declined | A transaction was declined (includes reason) |
card.transaction.completed | A settlement cleared |
card.funding.completed | A top-up completed |
customer.kyc.approved | A customer’s KYC was approved |
customer.kyc.rejected | A customer’s KYC was rejected |
card_issuer.limit_warning | Your program is approaching a volume limit |
Bulk Card Issuance
For issuing cards to many customers at once, batch the create-customer and create-card calls with appropriate rate limiting:
async function bulkIssueCards(users: UserRecord[]): Promise<void> {
const BATCH_SIZE = 10;
const DELAY_MS = 200; // stay within rate limits
for (let i = 0; i < users.length; i += BATCH_SIZE) {
const batch = users.slice(i, i + BATCH_SIZE);
await Promise.all(
batch.map(async (user) => {
const customer = await client.customers.create({
externalId: user.id,
firstName: user.firstName,
lastName: user.lastName,
email: user.email,
// ...
});
const card = await client.card.createCardForCustomer({
customerId: customer.customerId,
type: "virtual",
label: `${user.firstName} Card`,
currency: "USD",
});
await db.users.update(user.id, {
yativoCustomerId: customer.customerId,
yativoCardId: card.cardId,
});
})
);
if (i + BATCH_SIZE < users.length) {
await new Promise((r) => setTimeout(r, DELAY_MS));
}
}
}
Next Steps