Developer Guides
Virtual Account Provisioning API for Nigerian Fintechs: Build a Safe Account Lifecycle
Build a reliable virtual account provisioning flow for Nigerian customers, from eligibility checks and duplicate prevention to account restrictions and closure.
Choosing a virtual account provisioning API for Nigerian fintechs is only the first step. The harder engineering work is deciding when an account can be created, preventing duplicate issuance, linking it to the right customer, and controlling what happens when that customer’s status changes.
For Nigerian marketplaces, fintechs, and digital businesses, virtual accounts can give customers a bank-transfer destination without forcing your team to manually identify every incoming payment. But account creation should be treated as a controlled lifecycle, not a button that immediately returns bank details.
This guide explains how to build that lifecycle with Paddle’s virtual account capabilities. It focuses on provisioning and account management—not transaction reconciliation—and distinguishes application design patterns from provider-specific API behavior.
Virtual account provisioning API for Nigerian fintechs: define the account model
Before writing an integration, decide what each virtual account represents.
A marketplace might assign an account to a seller. A business finance product might assign one to each approved business customer. A collections product might need accounts associated with particular payment requests, subject to the account types its provider supports.
These are different product models. Do not assume an account intended for one model can safely serve another.
Document three decisions:
- Assignment: Is the account associated with a customer, business, or collection request?
- Lifetime: Should the assignment persist, or does the use case require a time-limited destination?
- Eligibility: Which verification and approval conditions must be satisfied before issuance?
Paddle offers virtual accounts using Nigerian Uniform Bank Account Numbers, or NUBANs. Confirm supported assignment models, account naming rules, limits, and lifecycle operations during integration planning.
Paddle is a banking-as-a-service platform by Pickpadi Global Ltd, not a bank. Banking services are provided by CBN-licensed partner banks. Your product copy should accurately describe the service rather than imply that your application or Paddle is itself a licensed bank.
Separate eligibility from account creation
An authenticated customer is not automatically eligible for a virtual account.
Your backend should evaluate the applicable verification requirements and partner rules before submitting a provisioning request. For business customers, that may include business verification, ownership checks, and internal risk approval. Individual customer requirements will depend on the product and partner-bank arrangement.
Maintain an explicit eligibility decision with:
- The customer’s internal identifier and entity type.
- Verification status and references to supporting records.
- The policy version used for the decision.
- Any unresolved review or restriction flags.
- The decision timestamp and responsible system or reviewer.
Keep sensitive verification material out of general application logs. Store references rather than copying identity documents into provisioning records.
Recheck eligibility when a queued request is executed. A customer might pass a check when they click “Create account” but become restricted before a background worker processes the request.
This is an implementation pattern, not legal advice. Confirm applicable obligations with your compliance team and partner, and check the latest CBN circulars relevant to your service.
Model provisioning as a state machine
A boolean such as has_virtual_account cannot explain whether issuance is pending, failed, or awaiting investigation.
Use an internal state machine that reflects what your system actually knows:
| Internal state | Meaning | Application behavior |
|---|---|---|
not_requested | No provisioning intent exists | Allow eligible customers to request |
queued | Intent is saved locally | Show setup in progress |
submitted | Provider request has been initiated | Block duplicate submissions |
active | Issuance is confirmed and details validated | Display account details |
unknown | Request outcome is unresolved | Investigate before retrying issuance |
failed | Failure is confirmed | Explain the next permitted action |
These are illustrative application states, not Paddle API status names. Map the documented provider responses to your internal model.
Track access restrictions separately from issuance status. An account can exist while its associated customer is restricted in your application. Likewise, blocking a customer in your interface does not prove that the bank-side account has stopped accepting transfers.
Prevent duplicate accounts before calling the provider
Duplicate provisioning can happen when a customer double-clicks, a browser retries, or two workers process the same job.
Start with a durable provisioning intent. Give each intent a unique identifier and enforce a database constraint for the assignment your product permits—for example, one current account assignment per customer and collection purpose.
A simplified flow looks like this:
authenticate caller
check customer ownership and current eligibility
create or retrieve provisioning intent under a uniqueness constraint
return existing account if already active
return pending status if submission is already underway
enqueue the intent for processing
The worker should acquire a processing lease or otherwise coordinate concurrent execution before making the external request.
If the provider supports idempotency for provisioning, reuse the same idempotency value for the same intent according to its documented rules. Do not assume a local UUID alone prevents duplicate creation at the provider.
Avoid holding a database transaction open across a network call. Persist the intent first, then use a recoverable job-processing pattern to submit and record the result.
Treat timeouts as unresolved outcomes
A timeout means your application did not receive a conclusive response. It does not necessarily mean account creation failed.
If the provider created an account but your worker lost the response, issuing a fresh creation request could produce a second account.
Move the intent to unknown and resolve it through the provider’s documented lookup, status, or support process. Where supported, use the original request reference to locate the result.
If no reliable resolution mechanism exists, route the case to an operations queue rather than repeatedly attempting issuance.
The customer-facing message should remain neutral: “Your account setup is still being confirmed.” Do not display an error that encourages the customer to start another request while the first may have succeeded.
Store ownership and account details defensively
Once issuance is confirmed, persist a durable mapping between your customer and the provider’s account reference.
Useful fields include:
- Internal customer ID and provisioning intent ID.
- Provider account reference.
- Account number stored as a string.
- Bank identifier, bank name, and confirmed account name.
- Issuance status, timestamps, and last verification time.
- Restriction flags and lifecycle audit references.
Do not use the account number as your sole ownership key. Scope provider references appropriately, and enforce tenant isolation whenever account details are retrieved.
Render the account name and bank details supplied through the confirmed provider flow. Never manufacture an account name from the customer’s profile or expose unconfirmed details from a partial response.
Treat account details as sensitive customer financial data. Limit administrative access, redact logs, and keep credentials entirely on the server.
Design restrictions and closure before launch
Account management does not end when the account becomes active.
Define what happens when verification expires, a customer requests closure, your risk team imposes a restriction, or a business changes its legal details.
For each event, separate three actions:
- Application control: What can the customer see or do in your product?
- Provider action: What supported restriction, update, or closure request must be made?
- Confirmation: What evidence establishes that the external change took effect?
If closure is asynchronous, keep it pending until confirmed. Preserve historical ownership mappings for audit and support; do not silently reassign an old account number to another customer.
Ask how incoming transfers are handled during restrictions and after closure. Your interface cannot guarantee rejection or return of funds unless the underlying service supports that behavior.
Pre-launch implementation checklist
Test more than the successful creation path:
- Two simultaneous requests produce one local provisioning intent.
- A worker crash after submission does not trigger blind reissuance.
- A timeout enters an unresolved state with an operational owner.
- Eligibility changes stop queued requests before submission.
- Cross-tenant requests cannot retrieve another customer’s account details.
- Provider responses are validated before account details appear.
- Restriction and closure messages match confirmed external behavior.
- Audit records identify who requested and approved lifecycle changes.
Monitor pending-account age, unresolved outcomes, confirmed failures, and manual-review backlog. Alert thresholds should reflect your actual service behavior and operational capacity, not assumed provider guarantees.
Build it with Paddle
Paddle provides virtual accounts alongside KYB/AML verification, ledgers, and NIP payouts to 120+ Nigerian banks, giving your team building blocks for a broader financial workflow.
Start with one clearly defined customer-to-account assignment model. Confirm verification requirements, provisioning responses, duplicate-request behavior, and supported lifecycle controls before expanding the rollout.
Ready to implement? create a free account and read the API docs to map this architecture to Paddle’s documented integration flow.
Keep reading
Payment Webhook Security for Nigerian Fintechs: A Developer Guide
Build a secure webhook pipeline for Nigerian payment products, from authenticity checks to replay protection and recovery. Learn how to connect Paddle events to controlled business workflows without trusting every incoming request.
Double-entry ledger integration for Nigerian fintechs: Build Auditable Wallet Balances
Build wallet balances that remain explainable through pending transfers, reversals and reconciliation. This guide covers ledger design, posting rules and a practical Paddle integration checklist.
Airtime and Data API Integration in Nigeria: Build a Reliable Top-Up Flow
Build an airtime and data purchase flow that handles uncertain delivery, duplicate requests, and refunds. This developer guide covers product discovery, ledger design, status handling, and launch checks for Nigerian digital businesses.
Paddle Build Studio
Want us to build it with you?
Build for Africa and the world. Our team can deliver your fintech, web or mobile product in 2–3 weeks — or integrate Paddle APIs and build it yourself.