---
title: USDT (Binance)
description: Accept USDT wallet top-ups by watching a Binance deposit address — read-only API key, network choice, address verification and unmatched deposits.
url: https://nexcmp.com/docs/billing/usdt/
applies_to: NexCMP 1.6.1
updated: 2026-11-02
---

# USDT (Binance)

> **Where in the admin:** Finance › Payment channels › USDT (`/payments/usdt`). Switch and fee: Finance › Payment channels › Fees & limits (`/payments/fees`). Unmatched deposits: Finance › Payment channels › Gateway events › PayPal & USDT (`/payments/events?tab=gateways`).

## What it does

Customers send USDT to **your Binance deposit address**; NexCMP reads the deposit history through a **read-only** Binance API key and credits the wallet when a deposit matches an open request. There is no payment-processor fee on your side other than what Binance charges, and no private keys are ever held by NexCMP.

## Requirements

| Item | Requirement |
|---|---|
| Binance account | A verified Binance account with USDT deposits enabled on the network you choose. |
| API key | A Binance API key with **Enable Reading** only. Enable Withdrawals, Internal Transfer and Spot/Margin Trading must be **off**. |
| IP restriction | Strongly recommended: restrict the key to the server's outbound IP (the **Test & verify address** dialog shows it). |
| Network | Outbound HTTPS to `api.binance.com`. No inbound port is needed. |
| Supported networks | `TRX` (Tron, TRC20), `BSC` (BNB Smart Chain, BEP20), `SOL` (Solana), `ETH` (Ethereum, ERC20). Coin is fixed to USDT. |
| Dependencies | None. |

::: warning Choose the network once
Customers who send on the wrong network lose the funds. Pick the network with low fees that your customers' exchanges support (TRX and BSC are the usual choices), and do not change it often.
:::

## Prepare the infrastructure

1. In Binance open **Account › API Management** and create a new API key (system generated). Give it a label such as "NexCMP".
2. Edit the permissions: leave only **Enable Reading** checked. Do not enable withdrawals, transfers or trading.
3. Under **Restrict access to trusted IPs only** add the public IP address of your NexCMP server. If you do not know it yet, create the key without the restriction, run the first test in NexCMP (it prints the outbound IP) and then add the IP.
4. Copy the **API key** and **Secret key** (the secret is shown only once).
5. Open **Wallet › Deposit › Crypto**, choose **USDT** and the **network** you will use, and copy the **deposit address** (for example a `T...` address on TRX or `0x...` on BSC/ETH).

## Connect in NexCMP

1. Open **Finance › Payment channels › USDT** (`/payments/usdt`).
2. In **API key (Binance › API Management)** paste **API key** and **API secret**. Both must be entered together.
3. In **Deposit address** choose the **Network** and paste the **USDT deposit address on the selected network**. The format is checked against the network (`T` + 33 characters for TRX, `0x` + 40 hex characters for BSC and ETH, base58 for SOL).
4. Click **Save**. Changing the address or network resets the verification and pauses the channel until you verify it again; the page asks you to confirm.
5. Click **Test & verify address**. (Unsaved changes are refused — the check runs on the saved configuration.) The dialog shows:
   - key permissions (reading, withdrawals, internal transfer, trading, IP restriction) — red warnings for dangerous permissions;
   - the server's outbound IP (to enter in Binance);
   - the network (deposits open or closed, required confirmations, dust);
   - the address Binance issues for that network and whether it **matches** yours.
6. When the address matches, NexCMP records the verification time. Only then can you open **Fees & limits**, turn on **USDT (Binance)**, check **USDT fee %** (default 1) and **USDT request expires after (mins)** (5–180, default 30), and click **Save channels & fees**.



## How a payment is matched

1. The customer enters an amount in **Billing › Deposit › USDT** and clicks **Get deposit address**.
2. NexCMP creates a request and shows the address, the network and an **exact amount** with six decimals — for example `19.173742`. The last four decimals are a random nonce that makes the amount unique to that request.
3. The customer must send **exactly** that amount on that network. A payment that does not match (rounded amount, wrong network) cannot be assigned automatically.
4. Every 60 seconds NexCMP reads the last 24 hours of Binance deposits. A matching deposit moves the request to *confirming* and, once Binance has the required confirmations, credits the wallet. A request that has seen funds never expires while confirmations are pending.
5. A request not paid within the expiry time (default 30 minutes) is marked expired.

## Verify

1. After the address is verified and USDT is switched on, sign in as a test customer and request a small deposit (the minimum top-up).
2. Send the exact amount from another wallet or exchange. Allow a few minutes.
3. The portal shows *Transfer seen — confirming*, then *USDT received — balance updated*.
4. The USDT page shows a recent **Last poll** time and **Unmatched** at 0.

## Limits & notes

- **Rate.** 1 USDT = 1.00 USD. The fee in **USDT fee %** is shown to the customer and either deducted from or added to the amount depending on **Customer pays top-up fee**.
- **No refunds.** USDT payments are never refunded to the source by NexCMP (HTTP 409 `usdt_no_refund`). Refund manually outside the system if you must.
- **Pending limit.** A customer has a limited number of open requests; beyond that the server answers `too_many_pending` (HTTP 429).
- **Resellers** can use their own Binance account; see [Resellers](https://nexcmp.com/docs/customers/resellers/).
- **If you share the Binance account** with another system, give each system a different network so two pollers never see the same deposit.

### Unmatched deposits

A deposit that matches no request (wrong amount, wrong network, expired request) creates a `deposit.unmatched` event and an admin alert. Open **Payment channels › Gateway events › PayPal & USDT**, find the event, check the transaction on Binance and click the assign action to credit the correct customer. The **Unmatched** counter on the USDT page and on the channels overview drops to 0 afterwards.

## Troubleshooting

| Symptom | Cause | Fix |
|---|---|---|
| "API key and secret must be entered together" | Only one field filled | Fill both. |
| "Address is not in the format of network ..." | Address does not fit the selected network | Re-copy it from Binance for the same network. |
| "Unsaved changes — Save first then Test" | Test runs on saved settings | Click **Save**, then test. |
| Warning "key has Enable Withdrawals" | Excess permission | Remove it in Binance API Management. |
| Warning "key not restricted to IP" | `ipRestrict` is off | Add the server's outbound IP shown in the dialog. |
| Warning "key lacks Enable Reading" | Permission missing | Enable Reading. |
| Warning "Binance has deposits disabled for USDT on the network" | Network suspended | Choose another network or wait. |
| "DANGER: configured address differs from the address Binance issues" | Wrong address or network | Copy the address again from Binance for that network. |
| USDT switch greyed out in Fees & limits | Address not verified | Run **Test & verify address** until it matches. |
| Customer paid, nothing credited | Rounded amount or wrong network | Find the event in Gateway events and assign it by hand. |
| Deposit seen but waiting a long time | Not enough confirmations yet | Wait; the request does not expire while confirming. |
