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

# Sandbox Environment

The sandbox is an environment isolated from production for API integration testing and flow validation. No real funds are transferred.

<div style={{ backgroundColor: '#F3FDE8', border: '1px solid #D5EFC0', borderRadius: '8px', color: '#3B8C24', fontWeight: 600, padding: '14px' }}>
  Sandbox data is test data only. Sandbox credentials and production credentials cannot be used interchangeably.
</div>

## Environment URLs

| Environment | Base URL                                  | Description                                     |
| ----------- | ----------------------------------------- | ----------------------------------------------- |
| Sandbox     | `https://openplatform-sandbox.gateapi.io` | Testing and integration                         |
| Production  | `https://openplatform.gateapi.io`         | Production environment with real fund movements |

Unless otherwise stated, API paths, signing rules, and response structures are the same as in production.

## Quick Start

| Step                   | Action                                                                                                                                                                                         |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1. Register or sign in | [Open the Sandbox Merchant Console](https://pay.gate.com/zh/sandbox/pay-merchant) and register or sign in with email verification.                                                             |
| 2. Obtain credentials  | Get your `ClientId` and Payment API Secret in the merchant console, then configure a callback URL. See [Merchant Access](/essentials/version/100/en/common/accessguide).                       |
| 3. Call APIs           | Use the sandbox base URL to call the target APIs. Verify query APIs first, then create test orders or static payment QR codes. See [Quickstart](/essentials/version/100/en/common/quickstart). |
| 4. Simulate payment    | Trigger a simulated payment from the order details page, checkout page, or static payment QR code list to verify status transitions.                                                           |
| 5. Verify callbacks    | Confirm that webhook signature verification, idempotency, and status synchronization work correctly.                                                                                           |

## Currently Supported APIs

<div style={{ backgroundColor: '#F3FDE8', border: '1px solid #D5EFC0', borderRadius: '8px', color: '#3B8C24', fontWeight: 600, padding: '14px' }}>
  Continuously expanding，API capabilities are released in phases. Refer to this list before integration testing.
</div>

<table>
  <thead>
    <tr>
      <th style={{ textAlign: 'left', paddingRight: '16px' }}>Module</th>
      <th style={{ textAlign: 'left', paddingLeft: '0', paddingRight: '16px' }}>API capability</th>
      <th style={{ textAlign: 'left' }}>API path</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }} rowspan="4">Customer Management</td>
      <td style={{ textAlign: 'left', paddingLeft: '0', paddingRight: '16px' }}>Create customer</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/channelmanage/save</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query customer</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/channelmanage/list</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Update customer</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/channelmanage/update</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Delete customer</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/channelmanage/delete</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }} rowspan="7">Static Address / Static Payment QR Code</td>
      <td style={{ textAlign: 'left', paddingLeft: '0', paddingRight: '16px' }}>Query supported networks and currencies</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/fixedaddress/chains</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Create a static payment address</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/fixedaddress/save</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Create a static payment address on an EVM network</td>
      <td style={{ textAlign: 'left' }}><code>/merchant/open/v1/pay/fixedaddress/evm/save</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query static payment address list</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/fixedaddress/list</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>View static payment address details</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/fixedaddress/detail</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Delete static payment address</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/fixedaddress/delete</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query static payment QR code bill list</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/fixedaddress/order/query</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }} rowspan="2">Checkout</td>
      <td style={{ textAlign: 'left', paddingLeft: '0', paddingRight: '16px' }}>Create checkout order</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/checkout/order</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query checkout order details</td>
      <td style={{ textAlign: 'left' }}><code>/v2/pay/order/query</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }} rowspan="7">Address Payment</td>
      <td style={{ textAlign: 'left', paddingLeft: '0', paddingRight: '16px' }}>Query supported chain list</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/address/chains</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query supported currency list</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/address/currencies</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query currencies available for conversion by order currency</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/address/supportedconvertcurrencies</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Create order</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/address/create</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query payment order details</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/address/query</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query on-chain transaction details</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/address/transactiondetail</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Verify address payment callbacks</td>
      <td style={{ textAlign: 'left' }}>Subject to the current sandbox callback configuration</td>
    </tr>
  </tbody>
</table>

## Simulation Capabilities

The sandbox does not provide real clearing or settlement. Payments and refunds are triggered through simulation entry points only to verify status transitions and callbacks.

| Business               | Simulation | Entry point                                                  |
| ---------------------- | ---------- | ------------------------------------------------------------ |
| Collection             | Payment    | Order details page<br />Checkout page (checkout orders only) |
| Static Payment QR Code | Payment    | Static payment QR code list                                  |
| Refund                 | Refund     | Collection order details page                                |

## Webhooks

Notification payloads, signing methods, and retry rules are the same as in production. Trigger callbacks with simulated payments or refunds to validate signature verification and idempotent processing. See [Notification](/essentials/version/100/en/common/notification).

## Switch to Production

* Change the base URL to `https://openplatform.gateapi.io`
* Replace sandbox `ClientId` and API Secret with production credentials
* Configure the production callback URL
* Confirm that signing, signature verification, idempotency, and callback retry logic have passed testing
* Complete a small real-order validation
