> ## Documentation Index
> Fetch the complete documentation index at: https://docs.conduit.financial/llms.txt
> Use this file to discover all available pages before exploring further.

# Sandbox overview

> How the Conduit sandbox cluster differs from production, what's mocked, and how to drive specific scenarios

## 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:

1. **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 `bankName` value, or registered-address magic value you submit.
2. **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/payouts` withdrawal, 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, Stellar); Tron returns `422 CHAIN_NOT_SUPPORTED`. A newly-provisioned customer gets real-testnet wallets; fund them from a faucet, and sign with a real passkey or a machine stamp. See [Use a real testnet](/sandbox/testnet) for the custody rule and the supported testnets.
3. **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.

Your sandbox API key is scoped to your sandbox organization and never reaches production.

## Sandbox vs. production at a glance

| Feature | Sandbox | Production |
| - | - | - |
| API key format | `ck_sandbox_...` | `ck_live_...` |
| Compliance screening | Isolated; outcome from address suffix, account-number suffix, magic `bankName`, or registered-address magic value | Real upstream call |
| Travel Rule | Isolated; the receiving institution's answer arrives after about 10 seconds | Real VASP resolution |
| Wallet signing | Real signature — a real passkey approval, or a machine-signer stamp at `POST /v2/signing-requests/:id/approve` ([Use a real testnet](/sandbox/testnet)) | Customer passkey via verify page |
| Chain broadcast | Real public testnet on a supported chain (Base, Ethereum, Polygon, Solana, Stellar), verifiable on the network's explorer; Tron is not supported ([Use a real testnet](/sandbox/testnet)) | Mainnet/testnet per asset config |
| Chain finality | Real testnet confirmation (\~minutes), verifiable on the explorer | Real chain confirmation (\~minutes) |
| Fiat settlement | `POST payouts/:id/simulate/settled` | Real rail settlement |
| Idempotency-key retention | 30 days | 30 days |
| Webhook signatures | Same HMAC-SHA256 as production | HMAC-SHA256 |
| Rate ingestion | Isolated (stable quotes; use `orders/:id/simulate/rate-lock-expired` to test expiry) | Live FX market |
| Sender-information deadline (the deposit stays held until you respond) | \~10 minutes | 30 days |
| KYC/KYB decisions | A business: `POST /v2/sandbox/applications/:id/simulate/decision` with body `{ "outcome": "approved" }` or `{ "outcome": "rejected" }`. The 1-hour timer only clears the automated identity checks; it does not approve. An individual whose identity-verification attestation matches the person, shows a verification date, and includes the ID document: approved with no call, usually within a few minutes; otherwise the same `simulate/decision` call. See [Customer KYC](/sandbox/customer-kyc). | Real review pipeline |

<Warning>
  Every crypto payout and order waits for a real signature — sandbox never
  auto-signs. On the deployed sandbox a non-custodial transfer parks at
  `transaction.awaiting_signature`: approve with a real passkey, or with a
  machine-signer stamp at `POST /v2/signing-requests/:id/approve` (see [Use a
  real testnet](/sandbox/testnet) and [Machine-signer
  stamping](/guides/machine-signer-stamping)). Production requires a
  real customer signature; sandbox mirrors that requirement.
</Warning>

<Note>
  **Sandbox-only conveniences (not behavior you get in production).**

  1. **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](/sandbox/onramps#errors) for the cap.
  2. **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 shortcut 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](/sandbox/testnet)).
  3. **`orders/:id/simulate/rate-lock-expired` cancels orders within seconds.** There is no fixed latency: wait for `order.cancelled`.
  4. **Forced-failure reasons stay internal.** After `transactions/:id/simulate/terminal { outcome: "failed", reason }` or an address-suffix scenario, the polled `GET` and the webhook payload carry the same standard text for the failure code as in production — the supplied `reason` does not appear. A payout that fails before it sends any transfer is cancelled instead (`transaction.cancelled`), because no money has moved yet. `orders/:id/simulate/conversion-failed { reason }` keeps the reason on the cancelled transfer; the order itself carries the standard text for its failure code.
</Note>

## Where to start

New to the sandbox? Follow the [Quickstart](/sandbox/quickstart) to complete your first end-to-end transaction in about 10 minutes. To onboard a natural person instead of a business, follow the [Individual quickstart](/sandbox/individual-quickstart).

For detailed guides on each transaction type:

* [Deposits](/sandbox/deposits) — fiat simulation, real testnet wallet funding, and the sender-information gate
* [Withdrawals](/sandbox/withdrawals) — crypto and fiat withdrawal simulation, chain scenarios
* [Conversions](/sandbox/conversions) — the FX conversion leg inside orders, rate-stale and provider-unavailable paths
* [Onramps](/sandbox/onramps) — fiat-in to crypto-out orders, full lifecycle
* [Offramps](/sandbox/offramps) — crypto-in to fiat-out orders, full lifecycle

Each per-flow page above covers happy paths plus the failure scenarios specific to that flow (deposit compliance, withdrawal signing, conversion failures, etc.). Copy-paste recipes live inline in those pages.

## Driving scenarios

Five mechanisms cover every meaningful failure mode:

* **Crypto destination address suffix** (last 8 hex chars on EVM; last 8 Base58 chars on Solana) — drives compliance and Travel Rule outcomes for crypto withdrawals. See the [consolidated withdrawal address-suffix catalog](/sandbox/withdrawals#consolidated-withdrawal-address-suffix-catalog) and [Travel Rule scenarios](/sandbox/travel-rule-scenarios).
* **Registered-address magic values** — drive the sanctions-screening verdict when registering a wallet address: an address starting with `0x999` parks the registration as `pending_screening` (202), resolved self-service via `POST /v2/sandbox/wallets/registered-addresses/:id/simulate/compliance-decision`; dedicated magic addresses force an immediate rejection (409). See [Registered Addresses — Testing in sandbox](/concepts/registered-addresses#testing-in-sandbox).
* **Fiat account-number suffix** (last 8 digits of `recipient.accountNumber` for payouts, or `senderInfo.accountNumber` for source deposits) — drives settlement outcomes for fiat payouts and source-funding compliance outcomes for fiat source deposits. See [Withdrawals](/sandbox/withdrawals), [Deposits](/sandbox/deposits), and [ONRAMP orders](/sandbox/onramps).
* **`autoPayout.recipient.bankName` magic value** (`SANDBOX_AML_REJECTED`, `SANDBOX_AML_SANCTIONED`) — drives compliance outcomes on the fiat payout leg of OFFRAMP orders. See [Offramps](/sandbox/offramps).
* **`POST /v2/sandbox/.../simulate/*` endpoints** — advance asynchronous state without waiting for automatic timers: 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 via `orders/:id/simulate/conversion-failed`. See [Withdrawal failure paths](/sandbox/withdrawals#failure-paths).

Address/account-number suffixes set the desired terminal state at creation time; simulate-\* endpoints let you inject failures or pre-empt any automatic timer for fine control.

## Notes

* Suffixes are matched against the **last 8 characters** of the rail-canonical destination address (lowercased hex for EVM; Base58 verbatim for 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.

## See also

* [Sandbox quickstart](/sandbox/quickstart)
* [Webhooks reference](/webhooks)
* [Error codes](/errors)
* [Deposits](/sandbox/deposits)
* [Withdrawals](/sandbox/withdrawals)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.