Skip to content

docs / test-credentials

Test Credentials

All test credentials only work with your sandbox API key (sk_sand_...). No real money is moved in sandbox mode.


Test cards

Use these card numbers in sandbox to simulate different authorization flows. The expiry, CVV, and name can be any valid values.

Successful flows

Card numberNetworkFlowDescription
4084084084084081VisaDirect (no PIN/OTP)Charge succeeds immediately
5061460410120223210VervePIN → OTPRequires PIN 1234 then OTP 123456
5399838383838381MastercardPIN onlyRequires PIN 1234
4751763333335678VisaPIN onlyRequires PIN 4321
6280280280280282VervePIN → OTPRequires PIN 0000 then OTP 000000

Decline flows

Card numberNetworkDecline reason
4084080000000409VisaInsufficient funds
5265335335335352MastercardCard blocked
5061460000000000000VerveInvalid card

PIN values

When a card flow requires a PIN, use 1234 unless a different PIN is listed in the table above.

OTP values

When an OTP step is required, use 123456.


Test virtual accounts

Virtual accounts are created dynamically when you initiate a bank_transfer payin in sandbox. The account number shown on the checkout is real within the sandbox environment.

To simulate receiving a bank transfer:

  1. Copy the Account number shown on the checkout
  2. Go to Dashboard → Sandbox → Simulator → Bank Transfer
  3. Paste the account number and enter the amount
  4. Click Send transfer — the payin transitions to succeeded within seconds

💡
The account name for all sandbox virtual accounts is Payve Merchant Virtual. This matches what would appear in a real bank's lookup.


Test mobile money numbers

Register test numbers in Dashboard → Sandbox → Simulator → Test Numbers before initiating a mobile money payin.

Preconfigured test numbers

Phone numberCurrencyOperatorAuth flow
+234 800 000 0001NGNMTNPIN → OTP
+233 500 000 001GHSMTNPIN only
+254 700 000 001KESM-PesaPIN only
+221 770 000 001XOFOrangePIN → birthday

Auth values

StepValue
PIN1234
OTP123456
Birthday01/01/1990

Simulating approval from the Simulator

  1. Go to Dashboard → Sandbox → Simulator → Pending Charges
  2. Find your charge by phone number
  3. Tap Approve (or Reject to simulate a failure)

Test payout scenarios

Payouts in sandbox always succeed unless the beneficiary account number matches a failure trigger.

Account numberScenario
Any valid numberSucceeds within 5 seconds
0000000000Fails with channel_beneficiary_bank_down
1111111111Fails with channel_unknown_error
9999999999Reversal after 30 seconds

Test FX rates

Sandbox FX rates are fixed (not live):

PairRate
USD → NGN1,645
EUR → NGN1,790
GBP → NGN2,090
USD → GHS13.5
NGN → USD0.00061

Sandbox control

You can adjust sandbox behaviour via the mock-channel API:

bash
# Set a 30% failure rate
curl -X PATCH http://localhost:4000/_control \
  -H 'Content-Type: application/json' \
  -d '{"failureRate": 0.3}'

# Set instant mode (webhooks fire immediately instead of with delay)
curl -X PATCH http://localhost:4000/_control \
  -d '{"mode": "instant"}'

# Set async mode (default — webhooks fire after 1–3 second delay)
curl -X PATCH http://localhost:4000/_control \
  -d '{"mode": "async"}'