# Test mode

> Use Moov test mode in the Dashboard or API to simulate accounts, transfers, card payments, ACH returns, instant payment failures, and disputes without real money.

> AI agents: search and read all Moov docs with the docs MCP server at https://docs.moov.io/mcp (no API key). Setup: https://docs.moov.io/guides/developer-tools/mcp-ai/docs-mcp/index.md

Simulate account and transfer scenarios on Moov’s platform without using real money.

Moov has pre-populated your test account with sample business details and accounts. You aren't required to enter anything for your test account to receive the `verified` status. In test mode, requirements for all [capabilities](/guides/accounts/capabilities/index.md) have been satisfied, so they are automatically enabled for you. You'll have full access to the following capabilities:

- [Transfers](/guides/accounts/capabilities/reference/index.md#transfers)
- [Wallet](/guides/accounts/capabilities/reference/index.md#wallet)
- [Send funds](/guides/accounts/capabilities/reference/index.md#send-funds)
- [Collect funds](/guides/accounts/capabilities/reference/index.md#collect-funds)

While you don't need to request capabilities for test mode, for [production mode](/guides/go-live/production-mode/index.md), you'll need to request capabilities. You can do this at the same time you create your account, or request additional capabilities later.

## Switch to test mode

When you sign up for Moov, you start in test mode. After you've completed your business profile and Moov has approved your production account, you can switch between production and test mode in the Moov Dashboard by using the account switcher in the upper left hand corner. Make sure you're in test mode before you explore the sample data.

![Toggle for test account in Moov Dashboard](/guides/shared-images/mode-toggle.png)

## Invite team members

Team members you invite in test mode only get access to your test account. See [invite team members](/guides/dashboard/settings/team/index.md#invite-team-members).

## API keys

Test mode needs its own API key; name it so you remember it's for testing. See [create a new API key](/guides/get-started/api-authentication/api-keys/index.md#create-a-new-api-key), including which domains you can register (`localhost` isn't accepted, so use a tunnel or preview domain such as ngrok, Netlify, or Vercel).

## Transfers

Transfers in test mode won't move any real money. For the timing of transfers in test mode, note that:

- Wallet to wallet transfers complete almost instantly
- Weekday ACH transfers in test mode will complete in about an hour (see the [processing speed](/guides/money-movement/ach/ach-processing-speeds/index.md) guide for production mode). Weekend ACH transfers in test mode will not clear on Saturday or Sunday. Weekend ACH transfers wait for the first banking day cutoff (Monday 12:00 AM ET).

ACH is not an instant rail, but test mode intentionally runs ACH steps more frequently than live transactions would progress. Build your integration to wait for transfer status updates instead of expecting ACH transfers to complete right away. To test failures, use the trigger amounts and values below instead of waiting for a real failure.

If you would like to see how Moov handles failures in production, view the [transfer failures](/guides/money-movement/events-and-statuses/index.md) guide.

American Express transfers need to be a minimum of $1. In production mode, American Express transfers less than $1 will result in an error.

### Test in the Dashboard

Use the sample accounts in your test account to simulate the flows you'll use in production mode. Test cards must be added through the [API](/api/sources/cards/create/index.md) or [Moov Drops](/moovjs/drops/card-link/index.md), because they can't be linked from the Dashboard. You can also pay a test mode [payment link](/guides/accept-payments/payment-links/index.md) with a test card on its hosted checkout page. Once a test card or bank account is linked, you can use the Dashboard to create test transfers and simulate disputes, ACH returns, instant payment failures, and more with the values below.

## Test mode data

To simulate card transfers, disputes, ACH returns, instant payment failures, bank account verification, and other transfer scenarios, use the test cards, amounts, and routing numbers in the sections below.

## Link cards & card acceptance

| Card brand       | Test card number   | CVV           | Postal code   | Expiration date | Card type |
|------------------|--------------------|---------------|---------------|-----------------|-----------|
| Visa             | `4111111111111111` | Any 3 numbers | Any 5 numbers | Any future date | Debit     |
| Mastercard       | `5555555555554444` | Any 3 numbers | Any 5 numbers | Any future date | Debit     |
| Discover         | `6011233333330000` | Any 3 numbers | Any 5 numbers | Any future date | Debit     |
| American Express | `372021002000199`  | Any 4 numbers | Any 5 numbers | Any future date | Debit     |
| Visa             | `4111300030003000` | Any 3 numbers | Any 5 numbers | Any future date | Credit    |
| Mastercard       | `5200900090009000` | Any 3 numbers | Any 5 numbers | Any future date | Credit    |
| Discover         | `6011111111111117` | Any 3 numbers | Any 5 numbers | Any future date | Credit    |
| American Express | `371111111111114`  | Any 4 numbers | Any 5 numbers | Any future date | Credit    |

See the postal and CVV sections below for additional test verification scenarios. Also note that test cards will expire once your chosen expiration date passes.

### Name verification

The card link `POST` [endpoint](/api/sources/cards/create/index.md) and `PATCH` [endpoint](/api/sources/cards/update/index.md) offer an optional `verifyName` field, which uses Visa's [ANI verification](https://usa.visa.com/content/dam/VCOM/regional/na/us/support-legal/documents/account-name-inquiry-onesheet-merchant-version.pdf) as a check against the supplied `holderName`. Use the following combinations of correct and incorrect names in the `holderName` field to test results.

*Correct name: Alex Nora Irwin*

| Name entered       | Individual name check                | Full name check |
|--------------------|--------------------------------------|-----------------|
| "Alex Nora Irwin"  | `match`, `match`, `match`            | `match`         |
| "Alex Noraa Irwin" | `match`, `partialMatch`, `match`     | `match`         |
| "Alx Nora Irwin"   | `partialMatch`, `match`, `match`     | `match`         |
| "Alex Irwin"       | `match`, `notChecked`, `match`       | `match`         |
| "Irwin"            | `notChecked`, `notChecked`, `match`  | `match`         |
| "Alex Nor Irwin"   | `match`, `noMatch`, `match`          | `partialMatch`  |
| "Axely Nora Irwin" | `noMatch`, `match`, `match`          | `partialMatch`  |
| "A N Irwi"         | `noMatch`, `noMatch`, `partialMatch` | `noMatch`       |
| "Alex Notwin"      | `match`, `notChecked`, `noMatch`     | `noMatch`       |
| "Alex Notwin"      | `match`, `notChecked`, `noMatch`     | `noMatch`       |

If ANI is not supported, you'll receive `unavailable` for all results.

### Postal code verification

| Card brand      | Verification result | Postal code |
|-----------------|---------------------|-------------|
| All card brands | `match`             | 11111       |
| All card brands | `noMatch`           | 22222       |
| Visa, Discover  | `notChecked`        | 88888       |
| All card brands | `unavailable`       | 99999       |

### CVV verification

| Card brand                 | Verification result | CVV code |
|----------------------------|---------------------|----------|
| Visa, Mastercard, Discover | `match`             | 111      |
| American Express           | `match`             | 1111     |
| Visa, Mastercard, Discover | `noMatch`           | 222      |
| American Express           | `noMatch`           | 2222     |
| Visa, Mastercard, Discover | `notChecked`        | 888      |
| American Express           | `notChecked`        | 8888     |
| Visa, Mastercard, Discover | `unavailable`       | 999      |
| American Express           | `unavailable`       | 9999     |

## Push & pull from card

| Card brand | Completed transfer | Failed transfer    |
|------------|--------------------|--------------------|
| Visa       | `4111100010002000` | `4111100050007000` |
| Mastercard | `5200828282828210` | `5200821111111114` |

The expiration date can be any future date. CVV can be any 3 numbers for Visa and Mastercard. Since push and pull card transfers require verifications, test cards always return a successful match for CVV, postal code, and (if requested) name verification, regardless of the values provided. To test negative verification results, use the test values in the [CVV verification](#cvv-verification), [postal code verification](#postal-code-verification), and [name verification](#name-verification) sections.

## Tap to Pay on mobile

Test mode allows you to verify your Tap to Pay integration on iOS and Android before processing live payments. The terminal configuration fetched from the Moov API determines whether the SDK operates in test or production mode. When using a test configuration, the SDK simulates card tap scenarios using these test cards:

| Card brand       | Test card number   | Result   |
|------------------|--------------------|----------|
| Visa             | `4111111111111111` | Approved |
| Mastercard       | `5555555555554444` | Approved |
| Discover         | `6011111111111117` | Approved |
| American Express | `371111111111114`  | Approved |
| Visa             | `4000020000000000` | Declined |
| Mastercard       | `5555000022220022` | Declined |
| Discover         | `6011000022220002` | Declined |
| American Express | `3711000022220002` | Declined |

When testing Tap to Pay on mobile with test cards, you don't need to enter a CVV, expiration date, or postal code. For platform-specific details, refer to the SDK documentation:

- [Tap to Pay on iPhone](https://moovfinancial.github.io/moov-ios/documentation/moovkit/test-mode)
- [Tap to Pay on Android](/guides/accept-payments/cards/tap-to-pay-android/index.md)

## Declined card transfers

| Card brand       | Test card number   | CVV           |
|------------------|--------------------|---------------|
| Visa             | `4000020000000000` | Any 3 numbers |
| Mastercard       | `5555000022220022` | Any 3 numbers |
| Discover         | `6011000022220002` | Any 3 numbers |
| American Express | `3711000022220002` | Any 4 numbers |

## Instant payments

To simulate an instant payment in test mode, [create a transfer](/api/money-movement/transfers/create/index.md) with `moov-wallet` as the source payment method and `instant-bank-credit` as the destination. `instant-bank-credit` only appears for bank accounts whose routing numbers are eligible for instant payments. The legacy `rtp-credit` payment method behaves the same way, but use `instant-bank-credit` for new integrations.

Use `021000021` as an instant-payment-eligible routing number in test mode.

You can simulate instant payment failures and rejections by using these specific transfer amounts. These amounts result in real time failures and the linked bank account entering an errored state.

| Transfer amount | Failure type             |
|-----------------|--------------------------|
| $72.03          | `AC03` / invalid-account |
| $72.04          | `AC04` / account-closed  |
| $72.06          | `AC06` / account-blocked |

If you would prefer to use the API to simulate a failure, you can trigger the failure in test mode by entering any of the return amount codes as the `value`. For example, to simulate an invalid account, enter `7203` as the `value`.

```json
{
  "amount": {
    "currency": "USD",
    "value": 7203
  }
}
```

## Surcharge fees

To simulate surcharge fees, use the following test credit cards.

| Card brand       | Test card number   | CVV           | Postal code   | Expiration date |
|------------------|--------------------|---------------|---------------|-----------------|
| Visa             | `4111300030003000` | Any 3 numbers | Any 5 numbers | Any future date |
| Mastercard       | `5200900090009000` | Any 3 numbers | Any 5 numbers | Any future date |
| Discover         | `6011111111111117` | Any 3 numbers | Any 5 numbers | Any future date |
| American Express | `371111111111114`  | Any 4 numbers | Any 5 numbers | Any future date |

Note that when processing surcharge fees on credit cards in production, you must follow card brand caps, as well as additional card network rules and state and federal regulations. Accounts must contact Moov to enable surcharging.

See the [surcharge](/guides/accept-payments/cards/surcharges/index.md) guide for more information.

> **Note:** Surcharging for American Express is not fully supported in production mode yet.

## ACH returns

You can simulate a few ACH return scenarios during different transfer stages. Trigger ACH returns in test mode by entering any of the return amount codes listed below as the `value` when [creating a transfer](/api/money-movement/transfers/create/index.md). For example, to simulate insufficient funds, enter `5501` as the `value`.

| Trigger Amount | Return Code | Description                        | Simulation Stage                |
|----------------|-------------|------------------------------------|---------------------------------|
| $55.01         | `R01`       | Insufficient Funds                 | Debit originated, not completed |
| $55.02         | `R02`       | Account Closed                     | Debit originated, not completed |
| $55.03         | `R03`       | No Account / Unable to Locate      | Credit completed                |
| $55.04         | `R04`       | Invalid Account Number Structure   | Credit completed                |
| $55.07         | `R07`       | Authorization Revoked by Customer  | Debit completed                 |
| $55.08         | `R08`       | Payment Stopped                    | Debit completed                 |
| $55.09         | `R09`       | Uncollected Funds                  | Debit originated, not completed |
| $55.10         | `R10`       | Customer Not Authorized            | Debit completed                 |
| $55.11         | `R11`       | Entry Not in Accordance with Terms | Debit originated, not completed |
| $55.15         | `R15`       | Account Holder Deceased            | Debit originated, not completed |
| $55.16         | `R16`       | Account Frozen                     | Debit originated, not completed |
| $55.20         | `R20`       | Non-Transaction Account            | Debit originated, not completed |
| $55.24         | `R24`       | Duplicate Entry                    | Debit originated, not completed |
| $55.29         | `R29`       | Corporate Customer Not Authorized  | Debit originated, not completed |

```json
{
  "amount": {
    "currency": "USD",
    "value": 5501
  }
}
```

A return is only triggered if the transfer type (for example, wallet-to-bank) is applicable to the particular return scenario and amount entered. For example, an `R01` in test mode always occurs on the debit leg, *after* the transfer stage of debit origination. Accordingly, an `R01` return cannot be triggered on a wallet-to-bank transfer, as that transfer type only consists of a credit leg. Creating a return scenario that does not apply to a corresponding transfer type results in a regular test transfer, not a test return.

Once you have created a transfer with an appropriate return code, Moov updates the transfer to `failed` or `reversed` based on the transfer stage (see [ACH returns and exceptions](/guides/money-movement/ach/returns/index.md) for more information). The bank account status is also updated accordingly.

## Disputes

| Card brand                  | Test card number   | Phase      | Reason code |
|-----------------------------|--------------------|------------|-------------|
| Visa                        | `4000200020002000` | Chargeback | 10.4        |
| Visa - Pull from card       | `4111100010003008` | Chargeback | 10.4        |
| Mastercard                  | `5555444400004444` | Chargeback | 4860        |
| Mastercard - Pull from card | `5555555555553339` | Chargeback | 4860        |
| Discover                    | `6011222222220000` | Chargeback | 05          |
| American Express            | `371010002000123`  | Chargeback | F29         |
| American Express            | `372020002000188`  | Inquiry    | 21          |

## Dispute evidence

| Text evidence      | Phase        | Outcome                                                                                                                                                         |
|--------------------|--------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `winning-evidence` | `chargeback` | Dispute will enter an `under-review` status for 10 minutes before updating to `status: won`. The chargeback is reversed and funds are credited to the merchant. |
| `winning-evidence` | `inquiry`    | Dispute will enter an `under-review` status for 10 minutes before updating to `status: closed`.                                                                 |
| `losing-evidence`  | `chargeback` | Dispute will enter an `under-review` status for 10 minutes before updating to `status: lost`.                                                                   |
| `losing-evidence`  | `inquiry`    | Dispute will enter an `under-review` status for 10 minutes before updating to `status: response-needed`.                                                        |

## Bank accounts

| Data                      | Description                                                  |
|---------------------------|--------------------------------------------------------------|
| Routing number            | Requires a valid routing number. Example: `322271627`        |
| Account number            | The account number can be any number. Example: `12345654321` |
| Instant verification code | `0001`                                                       |
| Micro-deposits            | `0,0`                                                        |

### Instant micro-deposits

To simulate an [instant micro-deposit](/guides/sources/bank-accounts/verification/index.md#instant-micro-deposits) verification in test mode, enter `0001` as the instant verification code.

### Micro-deposits

To simulate [traditional micro-deposit](/guides/sources/bank-accounts/verification/index.md#micro-deposits) verification in test mode, enter `0` for both amounts: `[0,0]`, and the bank account verification will succeed. If you input any other amount, the bank account verification won't complete.

### Plaid

To test linking bank accounts with Plaid, pass `env: "sandbox"` into the payload in the [Moov.js initialization](/moovjs/sources/bank-accounts/plaid-link/index.md). You can pass any token as the processor token and Moov links default account data:

```fallback
  RoutingNumber: "011401533",
  AccountNumber: "1111222233330000",
  AccountType:   "checking",
  Mask:          "0000"
```

## Spending card simulations

Simulate [spending card](/guides/issue-cards/index.md) authorizations, clearings, and reversals in test mode with Moov's API.

> **Note:** Card issuing is behind a closed beta. Test mode simulation endpoints can only be tested by those participating in the beta program.

### Authorization

Use the authorization simulation [endpoint](/api/v2026.10.00/money-movement/issuing/test-authorizations/index.md) to simulate a spending card authorization.

Pass the `accountID` for the business account for which the spending card was issued. The body must include an `amount` and `issuedCardID`. Optionally, you can pass `merchantData`.

```zsh
curl -X POST "https://api.moov.io/issuing/simulations/{accountID}/authorizations" \
  -H "Authorization: Bearer {token}" \
  -H "X-Moov-Version: v2026.10.00" \
  -d '{
  "amount": "50.00",
  "issuedCardID": "d04885c9-ea6b-43a7-9186-63d9fbd57716",
  "merchantData": {
    "networkID": "123456789012345",
    "name": "Whole Body Fitness",
    "city": "San Francisco",
    "country": "US",
    "postalCode": "94107",
    "state": "CA",
    "mcc": "7298"
  }
}'
```

### Clearing

Use the clearing simulation [endpoint](/api/v2026.10.00/money-movement/issuing/test-clearings/index.md) to simulate a spending card clearing.

Pass the `accountID` for the business account for which the spending card was issued and the `authorizationID` of the authorization to clear. Optionally, you can pass the `amount` to clear.

```zsh
curl -X POST "https://api.moov.io/issuing/simulations/{accountID}/authorizations/{authorizationID}/clearings" \
  -H "Authorization: Bearer {token}" \
  -H "X-Moov-Version: v2026.10.00" \
  -d '{
  "amount": "50.00"
}'
```

### Reversal

Use the reversal simulation [endpoint](/api/v2026.10.00/money-movement/issuing/test-reversals/index.md) to simulate a spending card reversal.

Pass the `accountID` for the business account for which the spending card was issued and the `authorizationID` of the authorization to reverse.

```zsh
curl -X POST "https://api.moov.io/issuing/simulations/{accountID}/authorizations/{authorizationID}/reversals" \
  -H "Authorization: Bearer {token}" \
  -H "X-Moov-Version: v2026.10.00"
```

