One integration.Stablecoin payments on every chain.
CNIXPay is a stablecoin payment gateway for merchants. Create an order with one API call, let customers pay on any supported network, and we confirm, settle and notify your server automatically.
Deposit addressTR7NHqjeKQxG…gjLj6tExpires in 28:41
Awaiting payment
Transfer detected on-chain
Amount met, settled
Merchant callback delivered
POST /notify → 200 OK
One order can offer several networks and tokens at once
TRONUSDT
BNB Smart ChainUSDT · USDC
EthereumUSDT · USDC
PolygonUSDT · USDC
SolanaUSDT · USDC
Available combinations are returned by the API
Product
Stablecoin acceptance, with the details done right
From address allocation to confirmation, from ledger entries to callbacks — every step is built to the standard that money must never be wrong.
Many chains, one order
Attach up to 10 network × token payment options to a single order. A payment on any of them counts toward the order, with your own checkout or ours.
Dedicated deposit addresses
Every order gets its own HD-derived address. Address pools are isolated per merchant and only reused within the same merchant after a cooldown, so attribution stays auditable.
Real-time, with a safety net
On-chain webhooks deliver deposits in real time while scheduled chain scans act as a fallback. A flaky channel never means a missed order.
USD pricing, 1:1 payment
Quote orders in USD and let customers pay in USDT or USDC at 1:1 — the same address accepts both. Native-coin orders in TRX, BNB and more are supported too.
Partial payments add up
If a customer underpays or sends several transfers, payments keep adding up and each one sends order.partially_paid. The order completes once paid in full; if it is still short when the grace period ends, the amount received is credited and order.underpaid is sent.
Signed callbacks, auto retries
Webhooks carry an HMAC-SHA256 signature and a timestamp. All four order events are retried for about 22 hours on failure, delivery logs are visible in the dashboard, and you can resend any event.
How it works
From order to balance in four steps
You create orders and handle callbacks. We take care of everything on-chain.
01
Create an order
Call POST /orders from your server with an amount and optional network / token payment options. You get deposit addresses or a hosted checkout link.
02
Customer pays
On your own page or our hosted checkout, the customer sends USDT / USDC to one of the addresses — on whichever network they prefer.
03
On-chain confirmation
Deposits are detected in real time and checked against the amount due. Paid in full means paid; short means we keep accumulating.
04
Settle and notify
Funds are credited to your merchant balance with a ledger entry, and a signed event is sent to your callbackUrl.
Developers
An API you can ship in an afternoon
Five REST endpoints cover every payment scenario: create, get, list, add payment options and close. One JSON envelope with clear error codes, every amount is a string, and an OpenAPI file is included.
Bearer auth
Authorization: Bearer <API Key>, with optional IP allowlists.
Idempotency-friendly
Merchant order numbers are unique per app and a duplicate returns the existing order; re-adding options or re-closing simply returns the current state.
Transparent rate limits
Per-endpoint limits are documented and return 429 with Retry-After, so backing off is straightforward.
import crypto from 'node:crypto'// rawBody must be the raw request body (Buffer); do not re-serialize parsed JSONexport function verifyWebhook(rawBody, headers, apiSecret) { const timestamp = headers['x-webhook-timestamp'] const signature = headers['x-webhook-signature'] ?? '' if (!/^\d+$/.test(timestamp ?? '') || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false const expected = 'v2=' + crypto.createHmac('sha256', apiSecret).update(`${timestamp}.`).update(rawBody).digest('hex') const a = Buffer.from(expected) const b = Buffer.from(signature) return a.length === b.length && crypto.timingSafeEqual(a, b)}// Express: app.post('/notify', express.raw({ type: 'application/json' }), handler)
Two ways to integrate
Build your own checkout, or use ours
Most control
Your own checkout
Pass paymentOptions when creating the order, receive every deposit address and amount due, and render network + token + address + QR code inside your own UI.
Create the order without paymentOptions and redirect the customer to the returned cashierUrl. Network selection, address, QR code, countdown and result pages are handled for you.
createOrder({ }) → cashierUrl
No payment page to build
Works on desktop and mobile
Redirects back to your returnUrl when done
Merchant dashboard
Where the money is, whether it arrived, and what to do next
The dashboard is designed around status and next actions, so finance and engineering both find what they need.
Balance & withdrawals
Settlements land in real time. Withdraw to your saved addresses and track every status along the way.
Transactions & on-chain detail
Filter by order number, address, status or time, and inspect transaction hashes and callback logs per order.
Reports & reconciliation
Export daily reports, fund details and ledger entries to CSV, with Chinese or English headers.
Apps & keys
Manage multiple apps, each with its own API key / secret, callback URL and IP allowlist.
Available balance12,840.42 USDT
Received today1,905.39
Orders today37
Recent payments
OrderNetworkAmountStatus
ORDER_10086TRON13.89Paid
ORDER_10085BSC250.00Paid
ORDER_10084Solana42.50Receiving
ORDER_10083Polygon99.00Awaiting
Security
Security is not a feature. It is the default at every layer.
Multi-factor withdrawals
Withdrawals require TOTP. Adding a withdrawal address requires an email code plus TOTP. After a password or email change, withdrawals pause for 24 hours.
API access control
API key authentication, IP allowlists and per-endpoint rate limits. Webhooks carry an HMAC-SHA256 signature and a timestamp to prevent forgery and replay.
Address isolation between merchants
Deposit addresses are allocated per merchant and never shared with others, so on-chain ownership is always clear.
Integer accounting
Amounts are computed and compared as integer micro-units. Every balance change is recorded for reconciliation and audit.
FAQ
What you may want to know first
Which networks and tokens are supported?
USDT and USDC on TRON, BNB Smart Chain, Ethereum, Polygon and Solana (USDT only on TRON). Available combinations are configured by the platform and returned by the API.
Do I need to manage wallets or private keys?
No. Deposit addresses are derived and monitored by the platform. Once an order completes, funds are credited to your merchant balance and you can withdraw to your own on-chain address any time.
What if a customer underpays or pays in several transfers?
The order stays pending and keeps adding up, sending order.partially_paid for each transfer; once the total reaches the amount due it becomes paid and order.paid is sent. If it is still short when the grace period after expiry ends, the amount received is credited, the order becomes underpaid and order.underpaid is sent for you to handle.
How do I reliably know an order is paid?
Rely on status == "paid" in the webhook order, always verify the signature, dedupe by X-Webhook-Id and keep the highest version. You can also get the order before shipping to double-check.
Which quote currencies are supported?
Orders are quoted in USD and paid in USDT or USDC at 1:1. You can also quote in a native coin (TRX, BNB, ETH, POL, SOL), in which case only that coin is accepted. Fiat quotes such as CNY are not supported.
Is there a sandbox?
There is no simulated sandbox. We recommend integrating with small real orders on a live network.
What are the fees?
Fees and the minimum withdrawal amount are shown in the merchant dashboard. The exact fee and net amount are displayed before you confirm each withdrawal.
How do I get an API key?
Create a merchant account, then create an app in the dashboard and submit it to go live. The app page shows your API key and API secret. Send the key as Authorization: Bearer; the secret is only used to verify webhook signatures — never put it in requests or front-end code.
When does an order expire, and what if the customer pays late?
30 minutes by default; set expireMinutes (5–1440) when creating the order, and it is returned as expireTime. A grace period follows expiry during which deposits and top-ups still count; funds arriving after that are handled manually by the platform.
What if the customer overpays?
Once the total received meets the amount due, the order is paid. The actual amount received is returned as paidAmount, and any overpayment is credited to your merchant balance as well.
Can I close an order?
Yes. A pending order that has not received any payment can be closed, after which deposits are no longer credited automatically. Orders that received a payment, or have one still confirming on-chain, cannot be closed.
Can I set a callback URL per order?
Yes. Pass callbackUrl when creating the order to override the app default; both must use https. Any HTTP 2xx from your endpoint counts as delivered.
What order statuses are there?
Just four: pending — no outcome yet, wait; paid — paid in full, fulfil; underpaid — only part paid when the grace period ended, handle manually; closed — nothing received, the order is closed.
Can one account run several stores or products?
Yes. A merchant account can have multiple apps, each with its own API key / secret, callback URL and IP allowlist. Orders and statistics are kept separate per app.
Are refunds supported?
The merchant payment API does not currently include a refund endpoint. If you need to refund, send the funds from your own wallet to the customer address.