What the sandbox does
The Conduit sandbox cluster (https://api.sandbox.conduit.financial) mirrors production with three differences designed to make integration safe and deterministic:
Compliance and banking are isolated — no third-party compliance or banking calls are made, and fiat settles synthetically. Crypto is different: the deployed sandbox (https://api.sandbox.conduit.financial) runs a real public testnet, so a crypto transfer a newly-provisioned customer makes on a supported chain (Base, Ethereum, Polygon, Solana) broadcasts and is signed for real (Use a real testnet). Fiat stays deterministic and synthetic; crypto is real on-chain.
- Compliance and Travel Rule are isolated. Sandbox builds never reach upstream compliance services. Outcomes are determined locally by your request data — specifically, by the destination address suffix, fiat account-number suffix, magic
bankNamevalue, or registered-address magic value you submit. - Crypto runs on a real public testnet. The deployed sandbox delivers and settles crypto on a real testnet: a crypto transfer that leaves a wallet — a
/v2/payoutswithdrawal, and the crypto source leg of an offramp or a crypto conversion — broadcasts and is signed on a real network, verifiable on that network’s block explorer. This covers the supported testnet chains (Base, Ethereum, Polygon, Solana); Tron and Stellar are not transactable on this posture. A newly-provisioned customer gets real-testnet wallets; fund them from a faucet, and sign with a real passkey or a machine stamp (simulate/cosignreturns409 SANDBOX_SIGNING_SIMULATION_UNAVAILABLE). A wallet provisioned before real testnet was enabled cannot transact — its payout/order is refused with422 LEGACY_MOCK_WALLET_UNSUPPORTED, so create a new customer. See Use a real testnet for the custody rule and the supported testnets. - Scenario forcing via magic values. Specific address suffixes, account-number suffixes, and magic field values deterministically trigger compliance, Travel Rule, and chain outcomes. See the per-flow guides below.
Sandbox vs. production at a glance
Sandbox-only conveniences (not behavior you get in production).
- Fiat liquidity is already there. In production the accounts behind every fiat payout must be funded before a payout can draw on them; in sandbox they already are — a funding account exists for every currency sandbox supports, so your first fiat payout in a supported currency never waits on it. Crypto is different on the real-testnet sandbox: a crypto delivery (an onramp, or a conversion’s destination leg) draws on a shared per-chain testnet float that is finite, so it can occasionally be delayed while that float is replenished, and a per-chain, per-UTC-day cap bounds how much each customer can draw. See ONRAMP orders — Errors for the cap.
- Crypto broadcast and finality are real. On the deployed sandbox a crypto transfer broadcasts on a real testnet and reaches finality in minutes, verifiable on the network’s explorer — there is no
simulate/confirmshortcut for it. Wallet creation and fiat deposits still settle without any manual action, so you can drive flows end-to-end through HTTP alone; fund crypto wallets from a faucet (see Use a real testnet). orders/:id/simulate/rate-lock-expiredcancels orders in about 3 seconds via an immediate sweep tick (not the 30-second scheduled sweep).- Forced-failure reasons round-trip 1:1 for transactions.
transactions/:id/simulate/terminal { outcome: "failed", reason }and address-suffix scenarios flow the supplied text to the polledGETand to the webhook payload identically. A payout failed before any transfer was sent is cancelled (transaction.cancelled), because that is the only way a payout ends before it reaches a rail.orders/:id/simulate/conversion-failed { reason }keeps the reason on the cancelled transfer; the order carries the standard text for its failure code. - Force-failing a payout at the cosign gate frees the wallet immediately; the next payout on the same wallet is accepted within milliseconds, with no cooldown.
Where to start
New to the sandbox? Follow the Quickstart to complete your first end-to-end transaction in about 10 minutes. For detailed guides on each transaction type:- Deposits — fiat simulation, real testnet wallet funding, and the sender-information gate
- Withdrawals — crypto and fiat withdrawal simulation, chain and cosign scenarios
- Conversions — the FX conversion leg inside orders, rate-stale and provider-unavailable paths
- Onramps — fiat-in to crypto-out orders, full lifecycle
- Offramps — crypto-in to fiat-out orders, full lifecycle
Driving scenarios
Five mechanisms cover every meaningful failure mode:- Crypto destination address suffix (last 8 hex chars on EVM; last 8 Base58 chars on Tron/Solana) — drives compliance and Travel Rule outcomes for crypto withdrawals. See Withdrawal failure paths and Travel Rule scenarios.
- Registered-address magic values — drive the sanctions-screening verdict when registering a wallet address: an address starting with
0x999parks the registration aspending_screening(202), resolved self-service viaPOST /v2/sandbox/wallets/registered-addresses/:id/simulate/compliance-decision; dedicated magic addresses force an immediate rejection (409). See Registered Addresses — Testing in sandbox. - Fiat account-number suffix (last 8 digits of
recipient.accountNumberfor payouts, orsenderInfo.accountNumberfor source deposits) — drives settlement outcomes for fiat payouts and source-funding compliance outcomes for fiat source deposits. See Withdrawals, Deposits, and ONRAMP orders. autoPayout.recipient.bankNamemagic value (SANDBOX_AML_REJECTED,SANDBOX_AML_SANCTIONED) — drives compliance outcomes on the fiat payout leg of OFFRAMP orders. See Offramps.POST /v2/sandbox/.../simulate/*endpoints — advance asynchronous state without waiting for automatic timers: chain finality (payouts/:id/simulate/confirm), fiat settlement (payouts/:id/simulate/settled), order-level failure (orders/:id/simulate/conversion-failed), rate-lock expiry (orders/:id/simulate/rate-lock-expired), counterparty webhook overrides (payouts/:id/simulate/counterparty-webhook), and transaction-level terminal simulation (transactions/:id/simulate/terminal) for withdrawals, deposits, onramps, and offramps. Internal-transfer rows are not simulatable. Conduit-internal movements (conversion legs, ops-to-ops sweeps) settle automatically; a conversion’s failure path is testable viaorders/:id/simulate/conversion-failed. See Withdrawal failure paths.
Notes
- Suffixes are matched against the last 8 characters of the rail-canonical destination address (lowercased hex for EVM; Base58 verbatim for Tron and Solana).
- Magic suffixes are sandbox-only. Sending the same address against the live API screens through real compliance and Travel Rule services — the suffix has no meaning there.
- Real-customer collision probability for an 8-char hex suffix is ~1 in 4.3 billion. Don’t use magic suffixes in production address books.
- The Sandbox group at the end of the API Reference enumerates every sandbox-only endpoint. These routes exist only on the sandbox host; calling them against the live API returns 404.