Prepaid Card Infrastructure
Build and launch prepaid card products through a bank-fintech infrastructure that handles the underlying card ledger and authorization while you build the customer experience.
Overview
CardInfra FIP Prepaid is a Card-as-a-Service (CaaS) infrastructure that enables banks and fintech partners to collaborate on the issuance and management of prepaid cards.
The solution is designed for partners that want to build card-based products without independently operating the underlying prepaid card infrastructure.
Issue cards
Request cards individually or in bulk using the card request APIs.
Fund cards
Load and unload prepaid cards through API-driven funding operations.
Manage cards
Retrieve card details and balance, set PIN, block and unblock cards.
Access transactions
Retrieve card and funding transactions for reconciliation and product experiences.
How it works
┌──────────────────────┐
│ FINTECH PARTNER │
│ │
│ Customer Application │
│ Product / Platform │
└──────────┬───────────┘
│ API
▼
┌──────────────────────┐
│ CardInfra FIP │
│ Prepaid │
├──────────────────────┤
│ Customer Management │
│ Card Management │
│ Funding │
│ Card Requests │
│ Transaction Access │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ PROVIDUS BANK │
│ │
│ Prepaid CMS / Ledger │
│ Card Authorization │
└──────────────────────┘
When a partner loads a card, the partner's account position with the bank is debited and the prepaid card is credited. An unload operation reverses the funding direction.
Sandbox
Use the following base URL for test-bed integration:
Upon successful completion of integration testing and certification, the partner will be provided with the *production Base URL and production API credentials* required for production onboarding.
Production credentials and access details will only be issued after the partner has successfully completed the required integration and certification process.
Authentication
Partners authenticate using their assigned clientId and clientSecret.
{
"clientId": "YOUR_CLIENT_ID",
"clientSecret": "YOUR_CLIENT_SECRET"
}
| Field | Type | Required | Description |
|---|---|---|---|
clientId | string | Yes | Partner client identifier. |
clientSecret | string | Yes | Partner client secret. |
{
"successful": true,
"token": "YOUR_ACCESS_TOKEN",
"expiration": "2026-10-01T12:00:00Z"
}
The supplied OpenAPI contract returns a token and expiration timestamp. The exact authorization header/security scheme for subsequent requests is not declared in the supplied OpenAPI document and should be confirmed with CardInfra.
Quick start
- Obtain your sandbox
clientIdandclientSecret. - Authenticate and obtain an access token.
- Onboard or identify your customer.
- Retrieve the available card profile.
- Request the card.
- Associate the card with the customer where applicable.
- Load the card with funds.
- Retrieve card details and balance as required.
- Use card transaction APIs or the agreed notification mechanism to keep your platform informed.
Customer onboarding
{
"firstName": "John",
"middleName": "Michael",
"lastName": "Doe",
"email": "john.doe@example.com",
"phone": "08012345678",
"nationality": "Nigerian",
"countryCode": "NG",
"address": "12 Example Street",
"residentCountry": "NG"
}
| Field | Type | Required |
|---|---|---|
| firstName | string | Yes |
| middleName | string | No |
| lastName | string | Yes |
| string / null | No | |
| phone | string | Yes |
| nationality | string | Yes |
| countryCode | string | Yes |
| address | string / null | No |
| residentCountry | string / null | No |
{
"customerId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"existingCustomer": false
}
Profiles
Returns available partner profiles.
[
{
"name": "Example Profile",
"id": "profile-id"
}
]Returns available card profiles that can be used when requesting cards.
[
{
"name": "Prepaid Card",
"id": "card-profile-id"
}
]Card request
{
"profileId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"cardProfileId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"nameOnCards": ["JOHN DOE"],
"instantQty": 1
}
| Field | Type | Required | Description |
|---|---|---|---|
| profileId | UUID | Yes | Partner/profile identifier. |
| cardProfileId | UUID | Yes | Card profile identifier. |
| nameOnCards | array[string] | No | Names associated with requested cards. |
| instantQty | integer | No | Quantity for the instant card request. |
{
"successful": true,
"requestNo": "REQ-000001",
"requestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Card association
{
"customerId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"cardId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
{
"successful": true
}
Retrieve cards
Filter by CustomerId, MaskedPan and/or NameOnCard.
GET /api/v1/cards?CustomerId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
{
"total": 1,
"data": [
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"maskedPan": "5399********1234",
"nameOnCard": "JOHN DOE",
"expiryDate": "12/29",
"balance": 50000.00
}
]
}
Funding
Funding APIs move value between the partner's account position with the bank and the prepaid card.
Debit the partner account position and credit the prepaid card.
{
"amount": 50000.00,
"cardId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
{
"successful": true,
"requestNo": "REQ-000001",
"code": "00",
"message": "Successful"
}
Debit the prepaid card and reverse the value to the partner account position.
{
"amount": 10000.00,
"cardId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
{
"successful": true,
"requestNo": "REQ-000002",
"code": "00",
"message": "Successful"
}
Card management
Block
POST /api/v1/card/block
{"cardId":"CARD_ID"}Unblock
POST /api/v1/card/unblock
{"cardId":"CARD_ID"}Set PIN
POST /api/v1/card/set-pin
{"cardId":"CARD_ID","pin":"1234"}Card transactions
Retrieve card transactions with optional card and date filters.
| Parameter | Required | Type |
|---|---|---|
| CardId | No | string |
| FromDate | No | date |
| ToDate | No | date |
| Page | Yes | integer |
| PageSize | Yes | integer |
GET /api/v1/card-transactions?CardId=CARD_ID&FromDate=2026-09-01&ToDate=2026-09-30&Page=1&PageSize=20
{
"total": 1,
"data": [
{
"transactionDate": "2026-09-30T12:30:00Z",
"maskedPan": "5399********1234",
"cardholder": "JOHN DOE",
"amount": "5000.00",
"currency": "NGN",
"impactType": "DEBIT",
"tranType": "PURCHASE",
"status": 1,
"terminalId": "TERM001",
"merchantNameLoc": "Example Merchant",
"merchantId": "MERCHANT001",
"rrn": "123456789012"
}
]
}
Funding transactions
Retrieve card funding activity using card and date filters.
GET /api/v1/fund-transactions?CardId=CARD_ID&FromDate=2026-09-01&ToDate=2026-09-30&Page=1&PageSize=20
{
"total": 1,
"data": [
{
"transactionDate": "2026-09-30T12:00:00Z",
"maskedPan": "5399********1234",
"cardholder": "JOHN DOE",
"amount": "50000.00",
"currency": "NGN",
"impactType": "CREDIT",
"tranType": 1
}
]
}
Transaction notifications
Partners may implement a webhook to receive transaction notifications. This allows the partner platform to update its own customer experience without repeatedly polling for every transaction.
Partners can also retrieve transactions through the card transaction API.
Error handling
| Status | Meaning |
|---|---|
200 | Request processed successfully. |
400 | Bad request or validation failure. |
404 | Resource not found. |
500 | Internal server error. |
{
"type": null,
"title": "Validation Error",
"status": 400,
"detail": "One or more validation errors occurred.",
"instance": null,
"errors": {
"fieldName": [
"Validation message"
]
}
}
Security
- Keep
clientIdandclientSecretconfidential. - Do not commit credentials to source code repositories.
- Protect authentication tokens.
- Do not log card PINs or authentication credentials.
- Use HTTPS for API communication.
- Mask PAN values in logs and support tooling.
- Restrict access to production credentials.
- Use appropriate timeout and retry handling.
Sandbox testing
Before production onboarding, partners should test authentication, customer onboarding, card requests, card lookup, card management, funding, transaction retrieval and relevant failure scenarios.
Authentication
Valid credentials, invalid credentials and token expiry.
Issuance
Single card requests, quantity-based requests and invalid profiles.
Funding
Load, unload, invalid card and insufficient account position scenarios.
Transactions
Card filters, date filters, pagination and funding history.
Support
For sandbox credentials, integration questions and technical support:
When contacting support, include your partner name, environment, endpoint, request timestamp, request reference where available, HTTP status code and response body. Never include client secrets, PINs or other sensitive credentials.