Skip to main content
Static accounts provide a permanent bank account number that routes funds into your meCash wallet. They are ideal for customers who pay you multiple times, high-value partners that need a fixed destination, or payout streams you want to reconcile to a single account. Unlike dynamic accounts, static accounts never expire. Once issued, the same account number can be shared across invoices, embedded in your CRM, or stored by customers for repeat transfers.

Supported Corridors

meCash static accounts currently support:
  • Nigeria (NGN) πŸ‡³πŸ‡¬
  • Malawi (MWK) πŸ‡²πŸ‡Ό
  • United States (USD) πŸ‡ΊπŸ‡Έ

How it Works: The Transaction Flow

This flow shows how a static account is created once and reused for every subsequent payment.

Common Use Cases

  • Recurring Customers: Assign one static account per enterprise buyer so every top-up, milestone payment, or retainer routes to the same reference, simplifying ledger reconciliation.
  • Corporate Collections: Provide each branch or franchise with a dedicated account and observe inflows per unit without opening new bank accounts manually.
  • Agency & Field Operations: Issue static accounts to agents in the field so they can collect deposits locally while you maintain centralized visibility.
  • Offline Channels: Publish the account number on invoices, websites, or signage. Customers can re-use it without requesting a fresh account each time.

Standard Currency-specific Request Examples

curl --request POST '{{baseURL}}/v1/virtual-account' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "currency": "NGN",
    "country": "NG",
    "firstName": "Jumoke",
    "lastName": "Dumebi",
    "email": "[email protected]",
    "phoneNumber": "+23481345XXXX",
    "bvn": "12345678901",
    "reference": "000023456X",
    "accountName": "Jumoke Dumebi"
  }'

Standard currency-specific Response Examples

{
  "message": "virtual account created successfully",
  "status": "success",
  "data": {
    "id": "e21f7365-4fc9-4669-a9d9-xxxxxxxxxxxxx",
    "firstName": "Jumoke",
    "lastName": "Dumebi",
    "email": "[email protected]",
    "phoneNumber": "+234813456XXXXX",
    "reference": "000033556X",
    "account": {
      "name": "Jumoke Dumebi",
      "bankName": "Mock Bank",
      "sortCode": null,
      "number": "881725XXXXX"
    },
    "status": "ACTIVE",
    "currency": "NGN",
    "country": "NG",
    "created": "2025-05-15T13:39:57.405Z"
  }
}

Error responses

StatusMessageCauseHow to fix
400Invalid country or currency ISO codeCountry or currency combination is not supported.Pass a valid ISO 3166 country + ISO 4217 currency pair.
400Phone number must include valid country codephoneNumber is not in international format.Send E.164 numbers such as +2348XXXXXXX.
400Request JSON malformed or missing required fieldsPayload is missing mandatory properties or contains invalid JSON.Validate required keys (currency, country, reference, etc.) before sending.
400BVN is requiredbvn was omitted for a corridor where it is mandatory (e.g., NGN).Provide an 11-digit BVN when creating Nigerian virtual accounts.
401API key missing or incorrectx-api-key header is absent, expired, or wrong environment.Include the correct workspace API key for the target environment.
409Reference must be uniqueThe reference has already been used in a previous request.Reuse the original response or send a fresh unique reference.
500Service temporarily unavailableTemporary backend/database failure.Retry with exponential backoff or contact support if it persists.

Best practices

  • Store the reference and response payload so you can reuse the virtual account without additional API calls.
  • Mask the BVN and other PII when logging requests to comply with data-protection policies.
  • Pair this endpoint with Get Virtual Account to confirm account details before displaying them to a customer.
  • Subscribe to virtualaccount.completed webhooks so you reconcile deposits the moment they land.