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

# Sandbox & Testing

> Build and test against simulated rails before going live.

Spritz provides a sandbox so you can exercise the full money-movement lifecycle
(onboarding, conversion, settlement, cards) against simulated rails, without moving
real funds.

## Base URL

The sandbox is a separate environment with its own base URL and its own credentials:

```
https://sandbox.spritz.finance
```

Use your sandbox integrator credentials here, exactly as you would in production. When
you're ready to go live, switch the base URL to `https://platform.spritz.finance` and
swap in your production credentials.

## Skipping identity verification

Real users must complete identity verification before they can move money. In the
sandbox you can skip it to keep test flows fast:

```bash theme={null}
# Simulate a successful US verification for the current user
curl -X POST https://sandbox.spritz.finance/v1/sandbox/bypass-kyc \
  -H "Content-Type: application/json" \
  # plus your integrator signing headers (see Authentication)
  -d '{ "country": "US" }'

# Simulate a verified EEA user
curl -X POST https://sandbox.spritz.finance/v1/sandbox/bypass-kyc \
  -d '{ "country": "EU" }'

# Simulate a failed verification
curl -X POST https://sandbox.spritz.finance/v1/sandbox/bypass-kyc \
  -d '{ "failed": true }'
```

Exactly one of `country` or `failed: true` is required. An empty body is a `400` —
there is no default.

### Capability groups

`country` selects a **capability group**: the set of offerings a verified user gets.
It is not an ISO country code. `EU` is the EEA as a whole, because every member state
sees the same offerings — passing a real country code like `DE` or `ES` is rejected
with a `400`.

| Group | Unlocks                                                                                                                       | Sandbox                        |
| ----- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------ |
| `US`  | On-ramp via ACH push and wire. Payouts via ACH, RTP and push-to-debit-card. Crypto card.                                      | Available                      |
| `EU`  | On-ramp and payout via SEPA credit transfer. Crypto card. Gated behind [EU regional compliance](/guides/regional-compliance). | Available                      |
| `CA`  | Canadian offerings.                                                                                                           | `501` — no sandbox fixture yet |
| `GB`  | UK offerings.                                                                                                                 | `501` — no sandbox fixture yet |

A `501` means the group is real but sandbox cannot simulate it yet; it is distinct from
the `400` an unrecognised value gets, and it is not worth retrying.

Every group still leaves requirements to satisfy before money can move — terms
acceptance, and regional compliance in the EEA. Read
[`GET /v1/users/me`](/api-reference) after the bypass to see each capability's `status`
and outstanding `requirements`, and
[`GET /v1/on-ramps/supported-pairs`](/api-reference) for the rail, network and token
combinations the group can actually use.

<Warning>
  Sandbox-only endpoints return `403` in production. Don't build production flows that
  depend on them.
</Warning>

## Simulating the rails

The sandbox also lets you drive the parts of a flow that normally depend on banks and
networks, so you can test the unhappy paths on purpose:

* **ACH returns**: `POST /v1/sandbox/deposits/direct` creates a direct deposit with an
  armed ACH return, so you can verify your `achDebitReturn.*` [webhook](/guides/webhooks)
  handling.
* **Bill activation and verification**: the `/v1/sandbox/bills/*` endpoints simulate
  bill activation and verification challenges.
* **Teardown**: `DELETE /v1/sandbox/funding-sources/{fundingSourceId}` removes a funding
  source so you can re-run a flow from a clean state.

See the [API Reference](/api-reference) for the full set of sandbox endpoints and their
request shapes.

## Going to production

<Steps>
  <Step title="Swap the base URL">
    Point requests at `https://platform.spritz.finance`.
  </Step>

  <Step title="Use production credentials">
    Sandbox and production credentials are separate. Move your production integrator
    key and secret into your secrets manager.
  </Step>

  <Step title="Run real verification">
    Remove any sandbox KYC bypass; real users complete
    [identity verification](/guides/quickstart) before moving money.
  </Step>
</Steps>
