Testing data

Sandbox cards, bank accounts, and triggers for every gateway.

Sandbox runs on pk_test_ / sk_test_ keys and never touches real money. Which test cards work depends on the gateway behind your workspace — a Stripe card is rejected on an NMI workspace and vice versa.

Which gateway am I on?

Call GET /tokenization-key with a publishable key — the response carries processor_type. Then use the matching table below.

processor_typeGatewayTest data to use
nmiNMIPaysio (NMI) below
paysioPaysio High Risk (white-label NMI)Paysio (NMI) below — identical
stripeStripeStripe below
aptpayPaysio Debit & PayoutsDebit & Payouts below

If Smart Routing is enabled, a single POST /charges can land on either gateway depending on the card BIN — the response processorType tells you where it went. See Charges.

Paysio (NMI) cards

Also covers the paysio white-label gateway. Use expiry 10/29 (any future date works) and CVV 999.

BrandNumberCVV
Visa4111111111111111999
Mastercard5431111111111111999
Discover6011000991300009999
American Express3411111111111119997
Diners Club30205252489926999
JCB3541963594572595999
Maestro6799990100000000019999

Paysio (NMI) ACH and outcome triggers

Save a bank account with type: "bank_account" on POST /customers/:id/payment-methods, then debit it with rail: "ach" on POST /charges.

FieldValue
routing_number490000018
account_number24413815
account_typechecking

On NMI the amount drives the outcome — the card number itself almost always approves:

OutcomeHow to trigger it
ApprovedAny amount of 100 ($1.00) or more
DeclinedAny amount below 100 — e.g. 50
Fatal / gateway errorAn invalid card number, e.g. 4111111111111129
AVS matchbilling_address_1: "888" and billing_postal_code: "77777"
CVV matchCVV 999

Amounts outside roughly $0.25–$130.00 are declined by the staging gateway as out of range, so keep test charges inside that window unless you are deliberately testing the amount decline. Do not combine a trigger amount with a card meant to trigger something else (an AVS/CVV card plus a decline amount) — the trigger amount bypasses normal authorization and the results contradict each other.

Stripe cards

Any future expiry and any CVC (4 digits for Amex). Card number drives the outcome.

NumberBrandResult
4242424242424242VisaSuccess
4000056655665556Visa (debit)Success
5555555555554444MastercardSuccess
2223003122003222Mastercard (2-series)Success
5200828282828210Mastercard (debit)Success
378282246310005American ExpressSuccess
6011111111111117DiscoverSuccess
4000000000000002VisaDeclined — generic_decline
4000000000009995VisaDeclined — insufficient_funds
4000000000009987VisaDeclined — lost_card
4000000000009979VisaDeclined — stolen_card
4000000000006975VisaDeclined — card_velocity_exceeded
4000000000000069VisaExpired card
4000000000000127VisaIncorrect CVC
4000000000000119VisaProcessing error
4242424242424241VisaIncorrect number (fails Luhn)
4000000000000101VisaCVC check fails
4000000000000036VisaPostal code check fails
4000000000000028VisaAddress line 1 check fails

Stripe workspaces are card-only on Paysiobank_account payment methods and rail: "ach" charges route through NMI or Debit & Payouts instead. For reference, Stripe's own ACH sandbox uses routing number 110000000 with account 000123456789 (success), 000222222227 (insufficient funds), 000111111113 (account closed), 000111111116 (no account), and 000333333335 (debit not authorized).

Debit & Payouts cards

Any future expiry and any CVC. Funds availability is what an POST /account-checks reports for a payout to that card.

NumberNetworkTypeFunds availability
5333619503715702MastercardDebitImmediate
5113400335932393MastercardDebitNext business day
5374340047244865MastercardPrepaidImmediate
5407795354428594MastercardPrepaidNext business day
4111111110124511MastercardCreditNot payout eligible
4916900573237001VisaDebitImmediate
4729260119078493VisaDebitNext business day
4703063492858097VisaPrepaidImmediate
4539803462059337VisaPrepaidNext business day
4916451102321668VisaCreditNot payout eligible
5525630721424710InteracDebitImmediate (CAD)

Credit cards are accepted for charges but never for payouts: POST /account-checks returns ACCOUNT_NOT_ELIGIBLE and the saved method reports payout_eligible: false. Send a complete US billing address with every card — a card saved without a billing postal code cannot be paid out to later.

For ACH and RTP, use routing number (ABA) 021000021 with any 4–17 digit account number.

Payout failure triggers

Sandbox keys the payout outcome off the amount. Send one of these amounts (in cents) to POST /payouts and the matching failure arrives asynchronously on the payout.failed webhook with that error_code. Any other amount settles normally to payout.paid.

amountCodeMeaning
51M001Account not eligible
52M002Invalid input value
53M003Declined
54M004System error
55M005Invalid input length
56M006Invalid input format
57M007Missing required input
58M008Limit exceeded
59M009Recipient account not eligible to receive funds
60M010Amount exceeds network limit
61M011Invalid card type
62M012Reversal
63M013Chargeback
64M014Representment
65M015Network error
66M016Cutoff timing
67M017Amount mismatch
68M018Unspecified error
69M019Service error
72M021Cancelled by the receiving party
JavaScript
// Trigger a declined payout (M003)
POST /payouts
{
  "customer_id": "customer-uuid",
  "payment_method_id": "instrument-id",
  "amount": 53,
  "rail": "card"
}

// → 200 { "status": "pending", ... }
// → webhook payout.failed { "error_code": "M003", "error_message": "Declined" }

ACH debits return asynchronously with standard NACHA return codes — R01 insufficient funds, R02 account closed, R03 no account, R04 invalid account number, R07 authorization revoked, R08 payment stopped, R10 not authorized, R16 account frozen — delivered as payment.disputed with dispute_kind: "ach_return". RTP failures use ISO reason codes such as AC04 (account closed), AM04 (insufficient funds), and NOAT (account does not support this message type).

3-D Secure test cards

Paysio runs 3DS through its own authentication service, independent of the gateway that authorizes the charge, so 3DS has its own card set. These PANs pick the authentication outcome. Use any future expiry and any CVC.

NumberBrandFlow / result
4147463011110134VisaFrictionless approval — status Y, no challenge
4016360000000493VisaChallenge with an outcome picker — choose any result in the challenge window
5239290700000102MastercardFrictionless approval — status Y
5239290700000151MastercardChallenge, then approval — challenge password secret!33
4147463011110142VisaDenied — status N
4147463011110159VisaAttempted — status A
4147463011110175VisaRejected — status R
4147463011110167VisaUnavailable — status U
5188340000000629MastercardDenied — status N
5188340000000937MastercardAttempted — status A
5188340000000952MastercardRejected — status R
5188340000000445MastercardUnable to authenticate — status U
4111111111111111VisaNot enrolled — tokenizes fine, but no authentication happens

These 3DS PANs are not gateway test cards

They exercise authentication only — the POST /charges that follows is expected to be declined by NMI, Stripe, or Debit & Payouts. To test 3DS and a successful authorization end to end, run the flow twice: once with a 3DS card to check the three_ds result, once with the gateway test card above to check the charge.

They are also deliberately not Luhn-valid. The hosted card fields relax number validation in sandbox so they can be entered; your own form should do the same if it validates card numbers client-side.

redirect_url must be a real, publicly reachable URL that accepts the challenge POST — localhost is rejected. Use a tunnel when testing locally.

Full flow and the fields to forward on the charge: 3D Secure.