> ## 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://www.gate.com/pay-merchant?source=doc) 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](/global/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](/global/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>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }} rowspan="5">Withdrawal</td>
      <td style={{ textAlign: 'left', paddingLeft: '0', paddingRight: '16px' }}>Create withdrawal order</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/withdraw</code></td>
    </tr>

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

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query supported chains by currency</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/wallet/currency\_chains</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query withdrawal fee</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/wallet/withdraw\_status</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query withdrawal records</td>
      <td style={{ textAlign: 'left' }}><code>/v1/pay/wallet/withdrawals</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }} rowspan="14">OTC</td>
      <td style={{ textAlign: 'left', paddingLeft: '0', paddingRight: '16px' }}>OTC quote</td>
      <td style={{ textAlign: 'left' }}><code>/withdraw/open/otc/api/v1/quote</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Create deposit order</td>
      <td style={{ textAlign: 'left' }}><code>/payment/open/otc/api/recharge</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Confirm deposit payment</td>
      <td style={{ textAlign: 'left' }}><code>/payment/open/otc/api/recharge/confirm</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Cancel deposit order</td>
      <td style={{ textAlign: 'left' }}><code>/payment/open/otc/api/recharge/cancel</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Deposit order list</td>
      <td style={{ textAlign: 'left' }}><code>/payment/open/otc/api/recharge/list</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Deposit order detail</td>
      <td style={{ textAlign: 'left' }}><code>/payment/open/otc/api/recharge/detail</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Create withdrawal order</td>
      <td style={{ textAlign: 'left' }}><code>/withdraw/open/otc/api/order/create</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Withdrawal order list</td>
      <td style={{ textAlign: 'left' }}><code>/withdraw/open/otc/api/order/list</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Withdrawal order detail</td>
      <td style={{ textAlign: 'left' }}><code>/withdraw/open/otc/api/order/detail</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query bank countries</td>
      <td style={{ textAlign: 'left' }}><code>/withdraw/open/otc/api/bank/country/list</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query bank account list</td>
      <td style={{ textAlign: 'left' }}><code>/withdraw/open/otc/api/bank/list</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Create bank account</td>
      <td style={{ textAlign: 'left' }}><code>/withdraw/open/otc/api/bank/create</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Submit bank account materials</td>
      <td style={{ textAlign: 'left' }}><code>/withdraw/open/otc/api/bank/material/supplement</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Delete bank account</td>
      <td style={{ textAlign: 'left' }}><code>/withdraw/open/otc/api/bank/delete</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }} rowspan="14">Institution</td>
      <td style={{ textAlign: 'left', paddingLeft: '0', paddingRight: '16px' }}>Create transfer</td>
      <td style={{ textAlign: 'left' }}><code>/transfer/open/institution/v1/pay/transfer</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query transfer details</td>
      <td style={{ textAlign: 'left' }}><code>/transfer/open/institution/v1/pay/transfer/detail</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Create charge</td>
      <td style={{ textAlign: 'left' }}><code>/transfer/open/institution/v1/pay/charge</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query charge details</td>
      <td style={{ textAlign: 'left' }}><code>/transfer/open/institution/v1/pay/charges/detail</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Create sub-account</td>
      <td style={{ textAlign: 'left' }}><code>/merchant/open/institution/v1/accounts/create</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Update sub-account</td>
      <td style={{ textAlign: 'left' }}><code>/merchant/open/institution/v1/accounts/update</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query sub-account details</td>
      <td style={{ textAlign: 'left' }}><code>/merchant/open/institution/v1/accounts/query</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>List sub-accounts</td>
      <td style={{ textAlign: 'left' }}><code>/merchant/open/institution/v1/accounts/list</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Get certification URL</td>
      <td style={{ textAlign: 'left' }}><code>/cashier/open/v1/certification/url</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query certification status</td>
      <td style={{ textAlign: 'left' }}><code>/cashier/open/v1/certification/verify/query</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Create fee rule</td>
      <td style={{ textAlign: 'left' }}><code>/rate/commission\_rule</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Upgrade fee rule</td>
      <td style={{ textAlign: 'left' }}><code>/rate/commission\_rule/upgrade</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>Query fee rule details</td>
      <td style={{ textAlign: 'left' }}><code>/rate/commission\_rule</code></td>
    </tr>

    <tr>
      <td style={{ textAlign: 'left', paddingRight: '16px' }}>List fee rules</td>
      <td style={{ textAlign: 'left' }}><code>/rate/commission\_rule/list</code></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](/global/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


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.