Adding external accounts
The flows for creating external accounts in sandbox are the same as in production. The last 3 digits of an external account’s primary identifier (account number, IBAN, CLABE, Spark wallet address, etc.) determine the test scenario when that account is used in transfers or quotes. For identifiers with a domain part (e.g. PIX email keys), append the test digits to the username portion — for example,testuser.002@pix.com.br.
Beneficiary name verification
For account types that support beneficiary name verification, you can simulate different verification outcomes in sandbox. Use account identifiers with a1xx suffix to trigger verification scenarios (this range is reserved for verification and does not conflict with transfer or quote test patterns):
| Suffix | beneficiaryVerificationStatus | Behavior |
|---|---|---|
| 102 | NOT_MATCHED | Account is valid but name does not match |
| 103 | PARTIAL_MATCH | Account is valid, name is a fuzzy match |
| 104 | PENDING | Verification still in progress |
| 105 | (error) | Returns 400 — invalid account |
| 109 | (error) | Returns 500 — simulated API error |
| Any other | MATCHED | Account is valid, name matches exactly |
Transfer in
In production, internal accounts are funded by sending a bank transfer to the account’s payment instructions or by pulling from an external account. In sandbox, you have two options:Transfer in from an external account
Use the/transfer-in endpoint to pull funds from an external account into an internal account. The external account’s number suffix determines the outcome:
| Suffix | Behavior |
|---|---|
| 002 | Insufficient funds — transfer fails immediately |
| 003 | Account closed/invalid — transfer fails immediately |
| 004 | Transfer rejected — bank rejects the transfer |
| 005 | Timeout/delayed failure — stays pending ~30s, then fails |
| Any other | Success — transfer completes normally |
Sandbox fund endpoint
Instantly add funds to any internal account using/sandbox/internal-accounts/{accountId}/fund:
Creating quotes (cross-currency transfers)
When creating a quote with an external account destination, the account number suffix determines the payment outcome after quote execution:| Suffix | Behavior |
|---|---|
| 002 | Quote execution failed |
| 003 | Long payment — completes after approximately 6 minutes |
| 004 | Counterparty delivery failed |
| 005 | Receiving bank returned payment (completes then transitions to failed) |
| 006 | User cancellation |
| 007 | Payout and refund failed |
| Any other | Successful payment |
externalAccountDetails inline in the quote request.
Executing a quote
After creating a quote, you need to fund it to trigger execution. There are two ways to do this in sandbox: Prefunded internal account — If your quote’s source is an internal account, fund the account using one of the methods described in transfer in, then call the quote execute endpoint to trigger the transaction:/sandbox/send to simulate this payment:
Transferring out funds
Use the/transfer-out endpoint to push funds from an internal account to an external account in the same currency. The external account’s number suffix controls the outcome using the same patterns as transfer in.
Sending to a UMA address
For UMA-based payments, use these sandbox addresses to simulate different scenarios:| UMA Address | Behavior |
|---|---|
$success.usd@sandbox.uma.money | Payment succeeds (USD) |
$success.eur@sandbox.uma.money | Payment succeeds (EUR) |
$success.mxn@sandbox.uma.money | Payment succeeds (MXN) |
$pending.long.usd@sandbox.uma.money | Simulates a long-pending payment |
$fail.compliance.usd@sandbox.uma.money | Simulates a compliance check failure |