All articles

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.

27 Oct 2026 7 min read

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 stateMeaningApplication behavior
not_requestedNo provisioning intent existsAllow eligible customers to request
queuedIntent is saved locallyShow setup in progress
submittedProvider request has been initiatedBlock duplicate submissions
activeIssuance is confirmed and details validatedDisplay account details
unknownRequest outcome is unresolvedInvestigate before retrying issuance
failedFailure is confirmedExplain 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:

  1. Application control: What can the customer see or do in your product?
  2. Provider action: What supported restriction, update, or closure request must be made?
  3. 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.

#Developer Guides#Virtual Accounts#Nigeria#Banking APIs

Keep reading

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.