Quick start
- Create an account and confirm your email. Your live API key is ready immediately.
- Open Integration in your dashboard, set the amount and order ID, and copy the widget code.
- Paste it on your payment page. When the customer pays, the payment appears in your dashboard and your balance grows.
colk_live_. It is a public key: it can create invoices and read their status, but it can never move money. It is safe to use in the browser.Checkout widget
The widget is a hosted page you embed with an iframe. It lets the customer choose a coin, shows the exact amount, the deposit address and a QR code, and switches to a success screen as soon as the payment is confirmed.
<iframe src="https://collect.izipay.me/checkout?key=colk_live_YOUR_KEY&amount=20&order_id=ORDER-1001"
width="420" height="700" style="border:0;border-radius:24px"></iframe>
| Parameter | Required | Description |
|---|---|---|
key | Yes | Your API key. |
amount | No | Invoice amount in USD, minimum 1. Leave it out to let the customer enter any amount in the coin they choose. |
order_id | No | Your order reference, up to 128 characters. It comes back in the dashboard and in webhooks. |
currency | No | Fix the coin: usdt, usdc, btc, eth, bnb, sol, trx or pol. |
network | No | Fix the network: trc20, bsc, polygon, eth, sol or btc. |
brand | No | Accent color as 6 hex digits without #, for example 2563eb. |
The dashboard has a builder that fills these parameters for you and gives you the ready code.
Payment links
The same URL works as a standalone payment page. Send it in a chat, an email or an invoice:
https://collect.izipay.me/checkout?key=colk_live_YOUR_KEY&amount=150&order_id=INV-2026-044
Payments API
Use the API when you build your own payment screen. All requests are JSON POST requests to one endpoint:
POST https://collect.izipay.me/api.php
Content-Type: application/json
Create an invoice
{
"action": "create",
"key": "colk_live_YOUR_KEY",
"amount": 49,
"currency": "usdt",
"network": "trc20",
"order_id": "A-1009"
}
Response:
{
"ok": true,
"payment_uuid": "2f6c1c3e-8d0a-4b6e-9a57-3c7f0e1d9b21",
"deposit_address": "TQ7mZ4xK9vRr2pLw8sNc…",
"pay_amount": 49,
"pay_currency": "USDT",
"network": "trc20",
"amount_usd": 49,
"expires_at": "2026-09-19 12:00:00"
}
Show the customer pay_amount of pay_currency and the deposit_address. For BTC, ETH, BNB, SOL, TRX and POL the amount is converted from USD at the current rate.
Check the status
{ "action": "status", "uuid": "2f6c1c3e-8d0a-4b6e-9a57-3c7f0e1d9b21" }
{
"ok": true,
"status": "paid",
"raw_status": "confirmed",
"amount_received": 49,
"amount_usd": 49,
"network": "trc20",
"currency": "USDT",
"deposit_address": "TQ7mZ4xK9vRr2pLw8sNc…",
"expires_at": "2026-09-19 12:00:00"
}
Payment statuses
| status | Meaning |
|---|---|
waiting | The invoice is open and we are watching the address. |
paid | The payment is confirmed on the blockchain and added to your balance. |
expired | Nothing arrived before expires_at. Create a new invoice. |
Stablecoin payments are credited for the amount that actually arrived, never more than the invoice. Other coins are credited in proportion to what arrived.
Webhooks
Add your endpoint on the Webhooks page of the dashboard. It must be a public https:// address. We send a JSON POST for these events:
| Event | When |
|---|---|
payment.confirmed | A payment is confirmed and added to your balance. |
refund.requested | A customer asked for a refund. Approve or decline it in the dashboard. |
{
"type": "payment.confirmed",
"payment_id": 5073,
"order_id": "A-1009",
"amount_usd": 49.00,
"fee_usd": 0.39,
"network_fee_usd": 1.00,
"net_usd": 47.61
}
Verify the signature
Every request has an X-Collect-Signature header: HMAC-SHA256 of the raw request body with your signing secret, in hex. Reject requests where it does not match, then reply with any 2xx status.
// PHP
$body = file_get_contents('php://input');
$sig = hash_hmac('sha256', $body, 'cols_YOUR_SECRET');
if (!hash_equals($sig, $_SERVER['HTTP_X_COLLECT_SIGNATURE'] ?? '')) { http_response_code(401); exit; }
$event = json_decode($body, true);
if ($event['type'] === 'payment.confirmed') { /* mark order $event['order_id'] as paid */ }
// Node.js (Express, raw body)
const crypto = require('crypto');
const sig = crypto.createHmac('sha256', process.env.IZICOLLECT_SECRET).update(req.rawBody).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(req.get('X-Collect-Signature') || ''))) return res.sendStatus(401);
status call before you ship goods.Coins and networks
| Network | network | Coins |
|---|---|---|
| Tron (TRC20) | trc20 | USDT, USDC, TRX |
| BNB Smart Chain | bsc | USDT, USDC, BNB |
| Polygon | polygon | USDT, USDC, POL |
| Ethereum (ERC20) | eth | USDT, USDC, ETH |
| Solana | sol | USDT, USDC, SOL |
| Bitcoin | btc | BTC |
Fees
No monthly fee. Each confirmed payment has two deductions: 0.8% of the amount, and a network fee that covers the blockchain gas we pay to move the payment to your balance.
| Network | Network fee per payment |
|---|---|
| Tron (TRC20) | $1.00 |
| BNB Smart Chain | $0.10 |
| Polygon | $0.10 |
| Ethereum (ERC20) | $1.00 |
| Solana | $0.05 |
| Bitcoin | $1.50 |
Your customer always pays the invoice amount. Both fees are deducted from the payment before it reaches your balance, and you see them per payment in the dashboard and in the webhook.
Refunds
After paying, the customer can open a refund form from the success screen and enter their wallet address. You get a refund.requested webhook and a request in Refunds. Nothing is sent until you approve. Approved refunds are sent from your balance automatically, minus the blockchain network fee. Refunds are available for Tron, BNB Smart Chain, Polygon and Ethereum payments.
Withdrawals
Withdraw your available balance in USDT to your own wallet on Tron, BNB Smart Chain, Polygon or Ethereum from the Withdraw page. The fee is 0.2%, the minimum is $5, and we pay the gas. Withdrawals usually arrive within a few minutes.
Limits and errors
| Limit | Value |
|---|---|
| Invoice amount | $1 to $100,000 |
| New invoices per account | 30 per minute |
| New invoices from one customer IP | 10 per minute |
| Open invoices per account | 150 at a time |
Errors come back with "ok": false and a readable error message, with HTTP 400 for bad input, 401 for a wrong key, 403 for a blocked account and 429 for rate limits.
Questions about the integration? Write to support@izipay.me.