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

> This guide shows how to set up the Conduit Sandbox.

The Conduit Sandbox is a safe environment to test integrations, simulate transactions, and explore the platform without using real funds. It mirrors production behavior so you can validate workflows before going live.

## Pre-requisites

* Active Conduit account with API access
* API credentials (API Key and Secret) - see [Setting up your API credentials](/guides/authentication)
* You have reviewed our [Customers](/core-concepts/customers) Core Concepts

## Postman Collection

Get started quickly by importing our Postman collection. It includes pre-configured requests for all sandbox endpoints.

<CardGroup cols={2}>
  <Card title="Open in Postman" icon="arrow-up-right-from-square" href="https://www.postman.com/conduit-fi/workspace/conduit-public/collection/44727866-310d5cb6-7754-4f8a-92ad-c73527707f35?action=share&creator=44727866">
    Fork the collection to your workspace and start testing immediately.
  </Card>

  <Card title="View Postman Guide" icon="book" href="/developer-sections/postman-collection">
    Learn how to set up and use the collection.
  </Card>
</CardGroup>

<Note>
  After forking, update the collection variables (`client_base_url`, `client_api_key`, `client_api_secret`, `api_version`) with your credentials.
</Note>

## Sandbox API base URL

```text theme={null}
https://sandbox-api.conduit.financial/
```

## Important notes

* Crypto deposits – Use simulator endpoints to deposit crypto in the sandbox.
* Compliance screening – All checks are simulated and do not reflect real verification.

## Overview

Use the sandbox to simulate the complete customer lifecycle:

1. Create customers
2. Simulate KYB verification
3. Change compliance status

## Authentication

All requests require API key and secret authentication. Include the `Api-Version` header:

```bash theme={null}
curl -X POST https://sandbox-api.conduit.financial/endpoint \
  -H "X-API-Key: your_api_key" \
  -H "X-API-Secret: your_api_secret" \
  -H "Content-Type: application/json" \
  -H "Api-Version: 2024-12-01"
```

## 1. Create a customer

Create a new customer in the sandbox environment.

**Endpoint:** `POST /customers`

### Request Example

```bash theme={null}
curl -X POST https://sandbox-api.conduit.financial/customers \
  -H "X-API-Key: your_api_key" \
  -H "X-API-Secret: your_api_secret" \
  -H "Content-Type: application/json" \
  -H "Api-Version: 2024-12-01" \
  -d '{
  "businessLegalName": "Acme",
  "country": "USA"
}'
```

### Response

```json theme={null}
{
  "id": "cus_30sTSsszBuLMXKPtKjNZf65ZJEI",
  "businessLegalName": "Acme",
  "kybLink": "https://verify-sandbox.aiprise.com/?business_onboarding_session_id=id_12234",
  "kybLinkExpiration": "2025-11-03T17:34:43.629Z"
}
```

## 2. Simulate customer KYB

Generate KYB data and simulate KYB verification for an existing customer.

**Endpoint:** `POST /simulator/customer-kyb`

<Note>
  Simulator endpoints are sandbox-only and may not appear in the public API Reference.
</Note>

### Request Schema

```json theme={null}
{
  "id": "string (required)",
  "countryCode": "string (required, ISO 3166-1 alpha-3)"
}
```

### Request Example

```bash theme={null}
curl -X POST https://sandbox-api.conduit.financial/simulator/customer-kyb \
  -H "X-API-Key: your_api_key" \
  -H "X-API-Secret: your_api_secret" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "cus_2ofTA13AD0xBtbEvBl20aEb1hEu",
    "countryCode": "USA"
  }'
```

## Response Example

```json theme={null}
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "type": "business",
  "businessLegalName": "Mocked Business Name",
  "businessTradeName": "Mocked Trade Name",
  "identificationNumbers": [
    { "type": "tax_identification_number", "value": "123456789" },
    { "type": "entity_id", "value": "ABC123XYZ456" }
  ],
  "operatingAddress": {
    "streetLine1": "123 Mock St",
    "streetLine2": "Suite 456",
    "city": "Mock City",
    "state": "MC",
    "postalCode": "12345",
    "country": "US"
  },
  "registeredAddress": {
    "streetLine1": "456 Mock Ave",
    "city": "Mock City",
    "state": "MC",
    "postalCode": "12345",
    "country": "US"
  },
  "phone": "+1-555-555-5555",
  "email": "mock@example.com",
  "website": "https://mockbusiness.com",
  "industryData": [
    { "codeType": "NAICS", "code": "123456", "description": "Retail" }
  ],
  "registeredDate": "2018-01-01T00:00:00.000Z",
  "status": "APPROVED",
  "controlPersons": [
    {
      "firstName": "John",
      "lastName": "Doe",
      "email": "johndoe@example.com",
      "roles": [
        { "name": "BENEFICIAL_OWNER", "startDate": "2020-01-01T00:00:00.000Z", "current": true }
      ],
      "ownershipPercentage": 50.0,
      "birthDate": "1980-01-01",
      "address": {
        "streetLine1": "789 Mock Blvd",
        "city": "Mock City",
        "state": "MC",
        "postalCode": "12345",
        "country": "US"
      },
      "nationality": "US",
      "gender": "male",
      "kycStatus": "APPROVED",
      "identityInfo": {
        "documentCountry": "US",
        "documentType": "PASSPORT",
        "documentNumber": "A12345678",
        "documentIssueDate": "2015-01-01",
        "documentExpiryDate": "2025-01-01"
      }
    }
  ],
  "kybCompletedAt": "2023-12-01T12:00:00.000Z",
  "vendorId": "simulator"
}
```

## Mocked Data Details

The response includes the following mocked data:

<AccordionGroup>
  <Accordion title="Business Details">
    | Field                   | Description                                           |
    | ----------------------- | ----------------------------------------------------- |
    | `businessLegalName`     | The legal name of the business                        |
    | `businessTradeName`     | The trade name of the business                        |
    | `identificationNumbers` | Includes a tax identification number and an entity ID |
  </Accordion>

  <Accordion title="Addresses">
    | Field               | Description                            |
    | ------------------- | -------------------------------------- |
    | `operatingAddress`  | The operating address of the business  |
    | `registeredAddress` | The registered address of the business |
  </Accordion>

  <Accordion title="Contact Information">
    | Field     | Description            |
    | --------- | ---------------------- |
    | `phone`   | A mocked phone number  |
    | `email`   | A mocked email address |
    | `website` | A mocked website URL   |
  </Accordion>

  <Accordion title="Industry Data">
    | Field         | Description                             |
    | ------------- | --------------------------------------- |
    | `codeType`    | The type of industry code (e.g., NAICS) |
    | `code`        | A 6-digit industry code                 |
    | `description` | A description of the industry           |
  </Accordion>

  <Accordion title="Control Persons">
    Includes details about individuals associated with the business, such as their name, roles, ownership percentage, and identity information.
  </Accordion>

  <Accordion title="KYB Status">
    | Field            | Description                                      |
    | ---------------- | ------------------------------------------------ |
    | `status`         | The KYB verification status (e.g., `APPROVED`)   |
    | `kybCompletedAt` | The timestamp when the KYB process was completed |
  </Accordion>
</AccordionGroup>

### Use cases

* Simulate KYB completion after customer creation
* Test different country-specific flows
* Generate synthetic KYB data for testing

## 3. Change compliance status

Simulate compliance status changes for customers or counterparties.

**Endpoint:** `POST /simulator/compliance`

### Customer compliance

#### Request Schema

```json theme={null}
{
  "type": "customer",
  "id": "string (required)",
  "status": "enum (required)"
}
```

#### Available customer status values

* `active`
* `in_compliance_review`
* `compliance_rejected`
* `created`
* `kyb_in_progress`
* `kyb_expired`
* `kyb_missing_information`
* `account_onboarding_pending`

#### Request Example

```bash theme={null}
curl -X POST https://sandbox-api.conduit.financial/simulator/compliance \
  -H "X-API-Key: your_api_key" \
  -H "X-API-Secret: your_api_secret" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "customer",
    "id": "cus_2ofTA13AD0xBtbEvBl20aEb1hEu",
    "status": "active"
  }'
```

### Counterparty compliance

#### Request Schema

```json theme={null}
{
  "type": "counterparty",
  "id": "string (required)",
  "status": "enum (required)"
}
```

#### Available counterparty status values

* `active`
* `deleted`
* `in_compliance_review`
* `compliance_rejected`

#### Request Example

```bash theme={null}
curl -X POST https://sandbox-api.conduit.financial/simulator/compliance \
  -H "X-API-Key: your_api_key" \
  -H "X-API-Secret: your_api_secret" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "counterparty",
    "id": "cp_2ofTA13AD0xBtbEvBl20aEb1hEu",
    "status": "active"
  }'
```

### Response

```json theme={null}
{
  "success": true
}
```

### Use cases

* Test compliance workflow transitions
* Simulate rejected customers/counterparties
* Enable customers/counterparties for transactions
* Test system behavior with different compliance states

## 4. Simulate Deposit

Simulate a crypto or fiat deposit into the system for the sandbox environment. This allows testing deposit flows without real blockchain transactions or actual bank transfers.

**Endpoint:** `POST /simulator/deposit`

<Note>
  Simulator endpoints are sandbox-only and may not appear in the public API Reference.
</Note>

## Request Schema

```json theme={null}
{
  "asset": "string (required, e.g., USDT, USDC, RLUSD, USD)",
  "network": "string (required, e.g., ethereum, tron, solana, polygon, base, xrpl)",
  "amount": "string (required, positive decimal, e.g., '10.50')",
  "destination": "string (optional for crypto, required for fiat - e.g., 'bank_...', 'acct_...', 'wlt_...')"
}
```

## Request Examples

### Crypto Deposit (Auto-discovered Destination)

For crypto deposits, the destination wallet is automatically discovered if not provided.

```bash theme={null}
curl --location 'https://sandbox-api.conduit.financial/simulator/deposit' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --header 'X-API-Key: your_api_key' \
  --header 'X-API-Secret: your_api_secret' \
  --header 'Api-Version: 2024-12-01' \
  --data '{
    "asset": "USDT",
    "network": "ethereum",
    "amount": "100000"
  }'
```

### Fiat Deposit (USD) with Bank Account Destination

For fiat deposits, the destination is required and must be a bank account ID, account ID, or wallet ID.

```bash theme={null}
curl --location 'https://sandbox-api.conduit.financial/simulator/deposit' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --header 'X-API-Key: your_api_key' \
  --header 'X-API-Secret: your_api_secret' \
  --header 'Api-Version: 2024-12-01' \
  --data '{
    "asset": "USD",
    "amount": "1000.00",
    "destination": "bank_2G6BST3Q0age8uCpYN7vIloQyxT"
  }'
```

### Fiat Deposit with Account ID Destination

You can also provide an account ID, which will be automatically resolved to the associated bank account.

```bash theme={null}
curl --location 'https://sandbox-api.conduit.financial/simulator/deposit' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --header 'X-API-Key: your_api_key' \
  --header 'X-API-Secret: your_api_secret' \
  --header 'Api-Version: 2024-12-01' \
  --data '{
    "asset": "USD",
    "amount": "1000.00",
    "destination": "acct_36iD4vUL0cT3zX5WrUpVqhMGWFN"
  }'
```

## Response Example

**Status Code:** `201 Created`

```json theme={null}
{
  "status": "success"
}
```

## Use Cases

* Simulate a crypto deposit for a customer in the sandbox environment
* Simulate a fiat (USD) deposit to test fiat deposit workflows
* Test deposit workflows without real blockchain transactions or bank transfers
* Validate application behavior for different deposit scenarios, such as large deposits or specific assets

## Notes

| Field         | Description                                                                                                                                                                                                                                                                                                |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `asset`       | Must be a valid stablecoin token (e.g., `USDT`, `USDC`, `RLUSD`) or `USD` for fiat deposits                                                                                                                                                                                                                |
| `network`     | Must specify the blockchain network (e.g., `ethereum`, `tron`, `solana`, `polygon`, `base`, `xrpl`)                                                                                                                                                                                                        |
| `amount`      | Must be a positive decimal string representing the deposit amount                                                                                                                                                                                                                                          |
| `destination` | **Optional for crypto deposits** (auto-discovered if omitted). **Required for fiat deposits**. Accepts:<br />- `bank_...` - Bank account ID (recommended for fiat)<br />- `acct_...` - Account ID (resolved to bank account for fiat)<br />- `wlt_...` - Wallet ID (for crypto or fiat with linked wallet) |
| Response      | Will always return a status of `"success"` upon successful simulation                                                                                                                                                                                                                                      |

## Common testing workflows

### Complete customer onboarding flow

1. **Create Customer**
   ```bash theme={null}
   POST /customers
   # Save the returned customer ID
   ```

2. **Simulate KYB Verification**
   ```bash theme={null}
   POST /simulator/customer-kyb
   # Use customer ID from step 1
   ```

3. **Activate Customer**
   ```bash theme={null}
   POST /simulator/compliance
   # Set customer status to "active"
   ```

## What's next?

* Onboard your first customer: [Create Your First Customer](/guides/customer/onboarding-customer)
* Add a counterparty: [Create Your Customer's First Counterparty](/guides/counterparty/adding-a-counterparty)
* Create your first transaction: [Create Your First Onramp Transaction](/guides/transaction/first-onramp-transaction) or [Create Your First Offramp Transaction](/guides/transaction/first-offramp-transaction)
* **Download our Postman Collection**: [Postman Collection Guide](/developer-sections/postman-collection) – Pre-configured requests for all sandbox endpoints.

## Support

Reach out to our [support team](https://support.conduitpay.com/) to get help and share your feedback.
