Use the test cards on this page to simulate card payment flows in the Sandbox environment without processing real transactions.
Test cards only work in the Sandbox environment. Never use real card details for testing.
Test cards
The following cards are available for testing across different networks, countries, and card types.
Card Number Type Country Features Method 5355223761921186Debit GB Deposit Instant 5573606426146833Debit GB Deposit, Withdrawal Instant 5518832400606463Debit US Deposit N/A 5318773012490080Debit US Deposit, Withdrawal Instant 5385308360135181Credit US Deposit N/A 5502514549870410Debit FR Deposit Instant 5436031030606378Credit MU Deposit N/A
Card Number Type Country Features Method 4921817844445119Debit GB Deposit Instant 4659105569051157Debit GB Deposit, Withdrawal Instant 4242424242424242Credit GB Deposit N/A 4024764449971519Debit US Deposit Instant 4485040371536584Credit US Deposit N/A
All test cards accept any valid three-digit CVV and any future expiry date in MM/YY format.
Simulating errors
To trigger a specific error response, use the corresponding reserved amount when creating a transaction with any of the test cards above. All other amounts will result in a successful transaction.
Amount Error Code Description 12.12card_unauthorizedThe card is not authorized for this transaction. 15.15card_declined_by_bankThe issuing bank declined the transaction. 20.20card_expiredThe card has expired. 26.26insufficient_fundsThe card has insufficient funds to cover the amount. 34.34velocityThe card has exceeded its transaction velocity limit. 60.60card_unauthorizedThe card is not authorized for this transaction.
The flow
Add a test card as an external account using the Create external account endpoint.
Use the returned external account ID when creating a deposit via Create quote and Create transaction .
To simulate a specific error, use the corresponding reserved amount in the quote request.
Add a test card
Call the Create external account endpoint with the test card details.
POST /core/external-accounts
{
"type" : "card" ,
"label" : "Test Visa Card" ,
"number" : "4921817844445119" ,
"securityCode" : "123" ,
"expiryDate" : {
"month" : 12 ,
"year" : 2030
}
}
{
"id" : "b98e4f0d-a67d-4126-a99d-666f7e0315d9" ,
"ownerId" : "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a" ,
"type" : "card" ,
"status" : "ok" ,
"label" : "Test Visa Card" ,
"asset" : "GBP" ,
"network" : "visa" ,
"features" : [ "deposit" ],
"details" : {
"type" : "debit" ,
"last4Digits" : "5119" ,
"expiryDate" : { "month" : 12 , "year" : 2030 }
},
"createdAt" : "2025-01-10T11:00:00.000Z" ,
"updatedAt" : "2025-01-10T11:00:00.000Z"
}
See all 17 lines
Create a quote
Use the id returned in the previous step as origin.id when calling Create quote .
POST /core/transactions/quote
{
"origin" : {
"type" : "external-account" ,
"id" : "b98e4f0d-a67d-4126-a99d-666f7e0315d9"
},
"destination" : {
"type" : "account" ,
"id" : "a00507fe-628c-4f27-ae81-e1c40b2a8fb8"
},
"denomination" : {
"asset" : "GBP" ,
"amount" : "50.00" ,
"target" : "origin"
}
}
{
"quote" : {
"id" : "623000c8-9bdf-4a2b-aa3d-6a6b44a7f6a0" ,
"origin" : {
"amount" : "50.00" ,
"asset" : "GBP" ,
"node" : {
"type" : "external-account" ,
"id" : "b98e4f0d-a67d-4126-a99d-666f7e0315d9" ,
"ownerId" : "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
}
},
"destination" : {
"amount" : "50.00" ,
"asset" : "GBP" ,
"node" : {
"type" : "account" ,
"id" : "a00507fe-628c-4f27-ae81-e1c40b2a8fb8" ,
"ownerId" : "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
}
},
"denomination" : {
"amount" : "50.00" ,
"asset" : "GBP" ,
"target" : "origin"
},
"fees" : [],
"expiresAt" : "2025-01-10T11:05:00.000Z"
}
}
See all 30 lines
Create a transaction
Commit the quote by calling Create transaction with the returned quote.id.
{
"quoteId" : "623000c8-9bdf-4a2b-aa3d-6a6b44a7f6a0"
}
{
"transaction" : {
"id" : "b1bbbc0f-dae2-4e94-9e6d-4b9d5a1f3c1f" ,
"origin" : {
"amount" : "50.00" ,
"asset" : "GBP" ,
"node" : {
"type" : "external-account" ,
"id" : "b98e4f0d-a67d-4126-a99d-666f7e0315d9" ,
"ownerId" : "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
}
},
"destination" : {
"amount" : "50.00" ,
"asset" : "GBP" ,
"node" : {
"type" : "account" ,
"id" : "a00507fe-628c-4f27-ae81-e1c40b2a8fb8" ,
"ownerId" : "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
}
},
"denomination" : {
"amount" : "50.00" ,
"asset" : "GBP" ,
"target" : "origin"
},
"fees" : [],
"status" : "processing" ,
"quotedAt" : "2025-01-10T11:00:00.000Z" ,
"createdAt" : "2025-01-10T11:02:00.000Z" ,
"updatedAt" : "2025-01-10T11:02:00.000Z"
}
}
See all 33 lines
Simulate an error
Follow the same steps as above, but set denomination.amount to one of the reserved error amounts when creating the quote.
POST /core/transactions/quote
{
"origin" : {
"type" : "external-account" ,
"id" : "b98e4f0d-a67d-4126-a99d-666f7e0315d9"
},
"destination" : {
"type" : "account" ,
"id" : "a00507fe-628c-4f27-ae81-e1c40b2a8fb8"
},
"denomination" : {
"asset" : "GBP" ,
"amount" : "26.26" ,
"target" : "origin"
}
}
After committing the quote via Create transaction , the transaction is returned with status: failed and a statusDetails.reason matching the reserved amount.
{
"transaction" : {
"id" : "c3ef10aa-8a34-4b2d-bc89-3e5d6f7a8901" ,
"origin" : {
"amount" : "26.26" ,
"asset" : "GBP" ,
"node" : {
"type" : "external-account" ,
"id" : "b98e4f0d-a67d-4126-a99d-666f7e0315d9" ,
"ownerId" : "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
}
},
"destination" : {
"amount" : "26.26" ,
"asset" : "GBP" ,
"node" : {
"type" : "account" ,
"id" : "a00507fe-628c-4f27-ae81-e1c40b2a8fb8" ,
"ownerId" : "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
}
},
"denomination" : {
"amount" : "26.26" ,
"asset" : "GBP" ,
"target" : "origin"
},
"fees" : [],
"status" : "failed" ,
"statusDetails" : {
"reason" : "insufficient_funds"
},
"quotedAt" : "2025-01-10T11:00:00.000Z" ,
"createdAt" : "2025-01-10T11:02:00.000Z" ,
"updatedAt" : "2025-01-10T11:02:00.000Z"
}
}
See all 36 lines