Self-hosted · Non-custodial · Open

Accept USDT payments and automate subscriptions.

A self-hosted crypto payment gateway for SaaS. Generate a unique deposit address per invoice, track confirmations on-chain, and activate subscriptions automatically — on Ethereum and TRON.

2 networks (ERC20 / TRC20)
~1–2 min to confirm
HD wallet per invoice
TRC20
ERC20
Invoice · #8f4e ● Awaiting payment
25.00 USDT
TYJPRrdB5APNeRs4R7fYZSwW3TcrTKw2gx
QR
12 / 19 confirmations
◆ USDT ♦ Ethereum (ERC20) ▲ TRON (TRC20) 🔒 HMAC-signed webhooks 💳 Auto-sweep to cold wallet
Why this gateway

Everything you need to take crypto

Batteries-included payment processing without a third-party processor taking a cut or holding your funds.

🔑

HD wallet per invoice

A fresh deterministic deposit address (BIP-44) for every invoice, derived from a single seed you control.

🌐

Multi-network USDT

Accept USDT on Ethereum (ERC20) and TRON (TRC20). Customers pick the cheaper, faster chain.

🔄

Automatic subscriptions

Confirmed payments activate or extend a user's subscription instantly — accumulation, over- and under-payment handled.

🔗

Signed webhooks

Push events (invoice.paid, subscription.activated) with HMAC-SHA256 signatures and automatic retries.

🧹

Auto-sweep + gas

Funds are swept to your cold wallet on a schedule, with deposit addresses auto-funded for gas.

🛡️

Non-custodial & self-hosted

You run it, you hold the keys. No processor, no custody, no per-transaction fees.

How it works

From invoice to active subscription

Four REST calls and the gateway handles the blockchain for you.

1

Create an invoice

POST the user, network and amount. Get back a unique deposit address valid for 30 minutes.

2

Customer pays

Show the address & QR. The customer sends USDT from any wallet or exchange.

3

Gateway confirms

We detect the transfer, wait for network confirmations, and mark the invoice paid.

4

Subscription activates

The subscription is created or extended automatically and a webhook fires to your app.

Supported networks

Two chains, one USDT

Pick mainnet defaults out of the box, or point at your own contracts and RPC.

Ethereum
USDT ERC20
Token standard
ERC20
Confirmations
6 blocks
Typical time
~2 minutes
Contract
0xdAC1…1ec7
TRON
USDT TRC20
Token standard
TRC20
Confirmations
19 blocks
Typical time
~1 minute
Contract
TR7N…Lj6t
Quickstart

Integrate in minutes

Create a user, open an invoice, then poll the status or listen for a webhook.

Create a userPOST /api/v1/users — once per customer.
Create an invoicePOST /api/v1/invoices — returns the deposit address & expiry.
Track the paymentPoll GET /api/v1/invoices/:id until paid, or receive a webhook.
Check the subscriptionGET /api/v1/subscriptions/:user_id — gate features by end_at.
🔑
AuthSend X-API-Key on every /api/* request when auth is enabled.
Try it in the dashboard →
cURL
JavaScript
Python
# 1. Create a customer
curl -X POST https://api.crypto-payment-gateway.slonix.dev/api/v1/users \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: YOUR_KEY' \
  -d '{"email":"customer@app.com"}'

# 2. Open an invoice for 25 USDT on TRON
curl -X POST https://api.crypto-payment-gateway.slonix.dev/api/v1/invoices \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: YOUR_KEY' \
  -d '{"user_id":"USER_ID","network":"TRC20","amount":25}'

# 3. Poll the status
curl https://api.crypto-payment-gateway.slonix.dev/api/v1/invoices/INVOICE_ID \
  -H 'X-API-Key: YOUR_KEY'
const API = 'https://api.crypto-payment-gateway.slonix.dev';
const H = { 'Content-Type': 'application/json', 'X-API-Key': KEY };

// create an invoice
const inv = await fetch(`${API}/api/v1/invoices`, {
  method: 'POST', headers: H,
  body: JSON.stringify({ user_id, network: 'TRC20', amount: 25 }),
}).then(r => r.json());

// poll until paid
const t = setInterval(async () => {
  const s = await fetch(`${API}/api/v1/invoices/${inv.id}`, { headers: H }).then(r => r.json());
  if (s.status === 'paid') { clearInterval(t); unlock(user_id); }
}, 5000);
import requests, time
API = 'https://api.crypto-payment-gateway.slonix.dev'
H = {'X-API-Key': KEY}

inv = requests.post(f'{API}/api/v1/invoices', headers=H, json={
    'user_id': user_id, 'network': 'TRC20', 'amount': 25,
}).json()

while True:
    s = requests.get(f'{API}/api/v1/invoices/{inv["id"]}', headers=H).json()
    if s['status'] in ('paid', 'expired'): break
    time.sleep(5)
FAQ

Frequently asked questions

The essentials about networks, custody, confirmations and integration.

Which cryptocurrencies and networks are supported?
The gateway accepts USDT on two networks: Ethereum (ERC20) and TRON (TRC20). Customers can pay on whichever chain is cheaper or faster.
Is the gateway custodial?
No. It is non-custodial and self-hosted. Each invoice gets a unique deposit address derived from an HD wallet seed that the operator controls, and funds are swept to the operator's own cold wallet.
How long until a payment is confirmed?
A payment is considered complete after the required confirmations: 6 blocks on Ethereum (about 2 minutes) and 19 blocks on TRON (about 1 minute).
How does subscription activation work?
When a confirmed payment covers the invoice amount, the gateway automatically creates or extends the user's subscription and fires a signed webhook to the merchant application.
What happens if a customer underpays?
The invoice is marked partial and stays open. Payments accumulate, so a top-up to the same address before the invoice expires completes it. Overpayments are accepted.
How do I integrate it into my application?
Use the REST API: create a user, open an invoice, then either poll the invoice status or listen for webhooks. Send the X-API-Key header on /api/* requests when authentication is enabled.

Start accepting crypto today

Open the dashboard to create your first invoice, or dive into the integration docs.