Skip to main content
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
1

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
}
2

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"]
}
3

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.
4

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"
    }
  }'
5

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"
}
6

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:
EventTrigger
card.transaction.approvedA card transaction was authorized
card.transaction.declinedA transaction was declined (includes reason)
card.transaction.completedA settlement cleared
card.funding.completedA top-up completed
customer.kyc.approvedA customer’s KYC was approved
customer.kyc.rejectedA customer’s KYC was rejected
card_issuer.limit_warningYour 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:
TypeScript
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