CardInfra Developers — FIP Prepaid API
Developers / FIP Prepaid
CardInfra FIP · Prepaid

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.

API version v1SandboxOpenAPI 3.1.1Providus Bank

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.

Balance and authorizationCard balances are maintained in the prepaid infrastructure at Providus Bank. Transaction authorization is completed within the bank's prepaid card infrastructure rather than exposed as a partner-side authorization API.

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:

https://fip-sandbox.proviudsbank.com/tpp/
Test Environment OnlyThe Base URL provided above is for *sandbox/test-bed integration purposes only*. It must not be used for production transactions.

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.

POST/api/v1/account/login
{
  "clientId": "YOUR_CLIENT_ID",
  "clientSecret": "YOUR_CLIENT_SECRET"
}
FieldTypeRequiredDescription
clientIdstringYesPartner client identifier.
clientSecretstringYesPartner 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

  1. Obtain your sandbox clientId and clientSecret.
  2. Authenticate and obtain an access token.
  3. Onboard or identify your customer.
  4. Retrieve the available card profile.
  5. Request the card.
  6. Associate the card with the customer where applicable.
  7. Load the card with funds.
  8. Retrieve card details and balance as required.
  9. Use card transaction APIs or the agreed notification mechanism to keep your platform informed.

Customer onboarding

POST/api/v1/onboard
{
  "firstName": "John",
  "middleName": "Michael",
  "lastName": "Doe",
  "email": "john.doe@example.com",
  "phone": "08012345678",
  "nationality": "Nigerian",
  "countryCode": "NG",
  "address": "12 Example Street",
  "residentCountry": "NG"
}
FieldTypeRequired
firstNamestringYes
middleNamestringNo
lastNamestringYes
emailstring / nullNo
phonestringYes
nationalitystringYes
countryCodestringYes
addressstring / nullNo
residentCountrystring / nullNo
{
  "customerId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "existingCustomer": false
}

Profiles

GET/api/v1/opt/profiles

Returns available partner profiles.

[
  {
    "name": "Example Profile",
    "id": "profile-id"
  }
]
GET/api/v1/opt/card-profiles

Returns available card profiles that can be used when requesting cards.

[
  {
    "name": "Prepaid Card",
    "id": "card-profile-id"
  }
]

Card request

POST/api/v1/card-request
{
  "profileId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "cardProfileId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "nameOnCards": ["JOHN DOE"],
  "instantQty": 1
}
FieldTypeRequiredDescription
profileIdUUIDYesPartner/profile identifier.
cardProfileIdUUIDYesCard profile identifier.
nameOnCardsarray[string]NoNames associated with requested cards.
instantQtyintegerNoQuantity for the instant card request.
{
  "successful": true,
  "requestNo": "REQ-000001",
  "requestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Card association

POST/api/v1/card/add
{
  "customerId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "cardId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
{
  "successful": true
}

Retrieve cards

GET/api/v1/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.

POST/api/v1/card/fund/load

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"
}
POST/api/v1/card/fund/unload

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"}
PIN securityNever log, persist or expose PIN values outside the approved secure integration flow.

Card transactions

GET/api/v1/card-transactions

Retrieve card transactions with optional card and date filters.

ParameterRequiredType
CardIdNostring
FromDateNodate
ToDateNodate
PageYesinteger
PageSizeYesinteger
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

GET/api/v1/fund-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.

Webhook contract pendingThe supplied OpenAPI specification does not define the webhook URL, request method, authentication mechanism, event types or payload schema. These should be provided separately by the CardInfra integration team before implementation.

Partners can also retrieve transactions through the card transaction API.

Error handling

StatusMeaning
200Request processed successfully.
400Bad request or validation failure.
404Resource not found.
500Internal server error.
{
  "type": null,
  "title": "Validation Error",
  "status": 400,
  "detail": "One or more validation errors occurred.",
  "instance": null,
  "errors": {
    "fieldName": [
      "Validation message"
    ]
  }
}

Security

  • Keep clientId and clientSecret confidential.
  • 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:

CardInfra Integration Support cardinfra@finrailz.com

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.