> ## Documentation Index
> Fetch the complete documentation index at: https://docs.puplar.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Test vs Live Mode

> sk_test_ vs sk_live_

Same URL. The key picks the mode. Test and live data are separate. No real money on `sk_test_`.

Test mode also **simulates** identity verification and bank account resolution. See [KYC](/guides/kyc#test-mode) and [Payouts](/guides/payouts#resolve-a-bank-account-test) for fixtures.

## Simulate a bank deposit (test)

```bash theme={"theme":{"light":"min-light","dark":"poimandres"}}
curl -X POST https://api.puplar.com/virtual-accounts/{id}/simulate-deposit \
  -H "Authorization: Bearer sk_test_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 10000 }'
```

`amount` is minor units, `100`–`1000000`. Live keys return `400`. Do not use this for cards.

## Test cards

NGN and USD checkout. Unknown PANs follow the PIN flow.

### Succeeds

| Flow                      | Number                | Expiry | CVV | PIN    | OTP     |
| ------------------------- | --------------------- | ------ | --- | ------ | ------- |
| PIN then OTP              | `5531886652142950`    | 09/32  | 564 | `3310` | `12345` |
| PIN then OTP (Verve)      | `5061460410120223210` | 10/31  | 780 | `3310` | `12345` |
| 3DS redirect              | `4187427415564246`    | 09/32  | 828 | `3310` | `12345` |
| 3DS redirect (Mastercard) | `5438898014560229`    | 10/31  | 564 | `3310` | `12345` |
| AVS                       | `4556052704172643`    | 09/32  | 899 | —      | —       |
| No extra auth             | `5061460166976054667` | 10/29  | 564 | —      | —       |

OTP `5548` = wrong OTP. `6648` = insufficient funds. Any other OTP succeeds on PIN cards.

### Declines

| Outcome            | Number             | Expiry | CVV | PIN    |
| ------------------ | ------------------ | ------ | --- | ------ |
| Do not honor       | `5143010522339965` | 08/32  | 276 | `3310` |
| Insufficient funds | `5258585922666506` | 09/31  | 883 | `3310` |
| Incorrect PIN      | `5399834697894723` | 09/31  | 883 | `3310` |
| Stolen card        | `5590131743294314` | 11/32  | 887 | `3310` |

## Test KYC (identity)

Use `sk_test_` with [`POST /customers/:id/documents`](/guides/kyc#submit-documents). Verification is simulated — no Prembly/identity provider call.

| ID type                      | Number                 | Result                       |
| ---------------------------- | ---------------------- | ---------------------------- |
| BVN                          | `22222222222`          | Verified                     |
| BVN                          | `11111111111`          | Fails                        |
| NIN (NG `national_identity`) | `12345678901`          | Verified                     |
| NIN (NG `national_identity`) | `10000000000`          | Fails                        |
| Passport / driver license    | Any + `id_front` image | Verified (synthetic profile) |

## Test bank account resolve

Use `sk_test_` with [`POST /misc/banks/ng/resolve`](/api-reference/misc/resolve-bank-account-by-country). Returns fixture names — no real NIP lookup.

| Account number                          | Bank code | Result                |
| --------------------------------------- | --------- | --------------------- |
| `0123456789`                            | `058`     | `Test NGN Account 1`  |
| `0987654321`                            | `011`     | `Test NGN Account 2`  |
| `0001234567`                            | `058`     | `Test Account Holder` |
| Any 10-digit number starting with `000` | any       | `Test Account Holder` |
| `9999999999`                            | any       | `404` not found       |

Full fixture list: same account/bank pairs as the [virtual account test pool](/guides/virtual-accounts).

Go live: switch to `sk_live_`, point webhooks at production, drop simulate-deposit, and use real ID numbers and bank accounts.
