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

# Sandbox and Testnet

> Use Brale's testnet environment to build and test stablecoin integrations without moving real funds.

Brale provides a testnet environment for non-production requests. There is no separate sandbox.

Only testnets (Sepolia, Solana Devnet, Base Sepolia, etc.) are supported. Blockchain mainnets (Ethereum, Solana, etc.) are not supported in testnet.

Real fiat movement is not supported in testnet. Brale does not contact a bank or move real funds. You can still test fiat-funded flows: testnet mints and burns skip the fiat leg, and you can [simulate inbound ACH and wire deposits](#4-simulate-a-deposit-into-a-testnet-automation) into testnet Automations.

See the full set of [supported blockchain networks](https://docs.brale.xyz/coverage/transfer-types.md#onchain).

## 1. Create API Credentials scoped to Testnet

Create an application on the Settings page in the Dashboard.

![Image](https://mintcdn.com/brale/BPXdiJ8ZrIJOuZ2b/images/brale/settings-api-credentials-dark@2x.png?fit=max\&auto=format\&n=BPXdiJ8ZrIJOuZ2b\&q=85\&s=fd19384fafa0c8f09bf955b8d289f763)

Select `Testnet` as Network and enable all resources.

![Image](https://mintcdn.com/brale/BPXdiJ8ZrIJOuZ2b/images/brale/settings-api-create-application-dark@2x.png?fit=max\&auto=format\&n=BPXdiJ8ZrIJOuZ2b\&q=85\&s=488d723e7bd65baec2292866d1e1d320)

## 2. Mint Tokens on Testnets

When you submit a mint on testnet, we skip the fiat leg and immediately mint on-chain. This simulates an onramp transaction and acts as a faucet to mint tokens for other flows (payouts, etc.).

**POST** `https://api.brale.xyz/accounts/account_id/transfers`

```json Request theme={null}
{
  "amount": {
    "value": "100",
    "currency": "USD"
  },
  "source": {
    "value_type": "USD",
    "transfer_type": "wire"
  },
  "destination": {
    "address_id": "2VcUIonJeVQzFoBuC7LdFT0dRe4",
    "value_type": "SBC",
    "transfer_type": "solana_devnet"
  }
}
```

## 3. Burn Tokens on Testnets

When you submit a redemption on testnet, we immediately burn on-chain and skip the fiat payout. This simulates an offramp transaction. No real wire, ACH, RTP, or FedNow payment is sent from testnet.

**POST** `https://api.brale.xyz/accounts/account_id/transfers`

```json Request theme={null}
{
  "amount": {
    "value": "100",
    "currency": "USD"
  },
  "source": {
    "address_id": "2VcUIonJeVQzFoBuC7LdFT0dRe4",
    "value_type": "SBC",
    "transfer_type": "solana_devnet"
  },
  "destination": {
    "value_type": "USD",
    "transfer_type": "wire"
  }
}
```

## 4. Simulate a deposit into a testnet Automation

Testnet [Automations](https://docs.brale.xyz/key-concepts/automations.md) return placeholder banking coordinates that cannot receive real deposits. To test the full Automation flow, simulate an inbound ACH, wire, or FedNow deposit. Brale runs the normal Automation, Transfer, and testnet mint flow and emits the normal `payment.completed` [webhook event](https://docs.brale.xyz/webhooks/webhook-events.md).

Your testnet API credentials need the `automations:write` and `network:testnet` scopes.

**Create an Automation with a testnet destination**

```bash theme={null}
curl --request POST \
  --url "https://api.brale.xyz/accounts/${ACCOUNT_ID}/automations" \
  --header "Authorization: Bearer ${AUTH_TOKEN}" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: $(uuidgen)" \
  --data '{
    "name": "Testnet Onramp",
    "source": { "value_type": "USD" },
    "destination": {
      "address_id": "'"${ADDRESS_ID}"'",
      "value_type": "SBC",
      "transfer_type": "base_sepolia"
    }
  }'
```

**Wait until the Automation is active**

```bash theme={null}
curl --request GET \
  --url "https://api.brale.xyz/accounts/${ACCOUNT_ID}/automations/${AUTOMATION_ID}" \
  --header "Authorization: Bearer ${AUTH_TOKEN}"
```

Continue when the response has `"status": "active"`.

**Simulate the deposit**

```bash theme={null}
curl --request POST \
  --url "https://api.brale.xyz/accounts/${ACCOUNT_ID}/automations/${AUTOMATION_ID}/simulations/deposits" \
  --header "Authorization: Bearer ${AUTH_TOKEN}" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: $(uuidgen)" \
  --data '{
    "amount": { "value": "10.00", "currency": "USD" },
    "transfer_type": "ach"
  }'
```

Brale returns `202 Accepted` with the resulting Transfer, including `automation_id`. `transfer_type` accepts `ach`, `wire`, or `fednow`. A `fednow` simulation produces a Transfer with `source.transfer_type: "fednow_credit"`. See [Receive FedNow deposits](https://docs.brale.xyz/guides/fednow-inbound.md#test-on-testnet).

**Fetch the Transfer**

```bash theme={null}
curl --request GET \
  --url "https://api.brale.xyz/accounts/${ACCOUNT_ID}/transfers/${TRANSFER_ID}" \
  --header "Authorization: Bearer ${AUTH_TOKEN}"
```

When `status` is `complete`, `destination.transaction_id` holds the testnet mint transaction. See [Simulate an Automation deposit](https://docs.brale.xyz/api-reference/brale/simulate-automation-deposit.md) for validation errors and idempotency behavior.

## Follow the Quick Start Guide

Follow [Quick Start - Your First Stablecoin Transfer](https://docs.brale.xyz/overview/quick-start.md) for next steps to get deeper with the Brale API.
