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

# Sandbox

> Build and test against the Multi-asset API with test money. What the sandbox can show you, and what it cannot.

The sandbox runs on its own domain, with its own data. All money on the
`/v2` sandbox is test money. A `/v2` sandbox request cannot move real funds.

| Surface   | Sandbox                            |
| :-------- | :--------------------------------- |
| Dashboard | `https://hermes.sandbox.jenzy.com` |
| API       | `https://api.sandbox.jenzy.com/v2` |

Sandbox keys and production keys are one group. Both start with `jz_live_`.
The base URL selects test money or real money. Keep the two keys apart, and
label each key clearly. The steps to get a sandbox key are the same as on
`/v1`. See [Test in the sandbox](/testing).

<Note>
  Jenzy operations must enable `/v2` for your org in the sandbox, as in
  production. Until then, each `/v2` request gets `404`.
</Note>

## Add test funds

A payout draws down a balance, so you must fund the balance first. In the
sandbox you simulate the collection yourself.

```bash theme={null}
curl -X POST https://api.sandbox.jenzy.com/v2/collections/simulate \
  -H "Authorization: Bearer jz_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "amount": "1000.00", "asset": "USD" }'
```

```json theme={null}
{ "id": "c1d2e3f4-…", "asset": "USD", "amount": "1000.00", "status": "processing" }
```

A `202` means that the sandbox accepted the request. The money credits in
about one minute, through the ordinary collection path. The credit is a real
collection in every way that changes your code. It appears in
`GET /v2/collections`, it credits your balance, and it sends
`collection.settled` to your endpoint.

<Warning>
  This request is not idempotent. A `202` means that the collection is on
  its way. Do not send the request again. Read `GET /v2/collections`
  instead. A second request makes a second collection.

  If `id` is `null`, the sandbox got the request, but Hermes lost its answer.
  The money can still land. Poll `GET /v2/collections`. Do not send the
  request again.
</Warning>

You can also do this in the sandbox dashboard. Open
**Multi-asset → Funding coordinates** and use **Simulate a collection**.

This endpoint is sandbox only. In production it answers `403` with the code
`sandbox_only`.

## USD is the conversion asset in the sandbox

The sandbox has one extra asset, **USD**. It exists only in the sandbox. USD
converts to USDT and to USDC at par, and back. This is the only conversion
pair, and the only FX payout pair, that the sandbox supports.

Use USD to test conversions. Fund USD with the simulator. Convert USD to
USDT, and USDT back to USD. Your production code is the same, with a
different fiat asset in the pair.

`GET /v2/assets` in the sandbox lists USD. In production it does not.

## What the sandbox can show

| Operation                              | In the sandbox                                                                                                                                                                 |
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Assets, balances, institutions         | Real reads, with the sandbox asset list.                                                                                                                                       |
| Fiat payouts (`bank`, `momo`)          | Real requests to the sandbox of the provider. A payout gets to `succeeded` or `failed`. The sandbox does not check the beneficiary, so a test name and a test account succeed. |
| Conversions                            | USD to USDT or USDC, and back, at par. Quote, execute, expiry, `quote_used`, and the two webhook events.                                                                       |
| FX payouts                             | A fiat payout paid from USDT or USDC. `source_amount`, `fee`, and `rate` are real figures.                                                                                     |
| Collections                            | Simulated collections only, with the endpoint above. The full credit path, `collection.settled`, and the balance movement.                                                     |
| Virtual accounts and deposit addresses | Real rows. You can read the coordinates.                                                                                                                                       |
| Webhooks                               | Real deliveries with `api_version: "v2"`, signed with your sandbox secret.                                                                                                     |
| Errors, idempotency, rate limits       | The same as production.                                                                                                                                                        |

Fees in the sandbox follow the same schedule as production.

## What the sandbox cannot show

Hermes fakes nothing in the sandbox. What the sandbox of the provider cannot
do, Hermes cannot show you. For each gap, **test in production with a small
amount**.

| Operation                                                    | Why                                                                                 | What to do                                                                           |
| ------------------------------------------------------------ | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| A real bank transfer or paybill payment to a virtual account | The sandbox does not accept a real transfer.                                        | Test in production with a small amount.                                              |
| A stablecoin transfer to a deposit address                   | The sandbox does not accept an on-chain deposit. The `wallet` source never appears. | Test in production with a small amount.                                              |
| A `wallet` payout                                            | The sandbox refuses a stablecoin payout.                                            | Test in production with a small amount.                                              |
| A payout reversal (`payout.reversed`)                        | The sandbox does not reverse a payout.                                              | Test in production with a small amount, or test your handler with a hand-made event. |
| A collection reversal (`collection.reversed`)                | The sandbox does not take back a collection.                                        | Test your handler with a hand-made event.                                            |
| A conversion in a fiat pair other than USD                   | The sandbox converts USD only.                                                      | Test in production with a small amount.                                              |
| `processing` on a conversion                                 | The sandbox answers at once.                                                        | Handle the status in your code as the docs describe.                                 |

<Note>
  A hand-made event is a JSON body that you make yourself. Sign it with your
  sandbox secret and send it to your own endpoint. Take the shape from
  [Webhooks](/webhooks) and the resource pages. It tests your handler. It
  does not test Hermes.
</Note>

## Move to production

Your code does not change. Change the base URL, change the key, and remove
USD from your asset list. The asset list of your org in production comes
from `GET /v2/assets`. Then do the steps in [Go live](/going-live).
