144 Pay generates a disposable address for each payment, detects it on-chain and distributes the funds per your configuration. And with dispersions you pay 50 wallets in a single tx. Your business never touches keys.
Every technical decision rests on one simple invariant: fee + Σ destinations == gross. Not a single unit lost.
A fresh HD address for every payment, derived from a BIP-44 master mnemonic. Full traceability, no reuse, no mixing.
A fee payer funds the gas, the disposable wallet transfers the USDT to your treasury. You never sign anything manually.
Split the payment across N destinations by percentage, with a percentage or fixed maintenance fee. Editable from the panel.
Our own polling with retries, reorg handling and a persisted cursor. No reliance on third-party webhooks.
Every state change fires a POST to your URL, signed with HMAC-SHA256. You verify it comes from 144 Pay and no one else.
USDT on Polygon (6 dec.) and BSC (18 dec.), USDC and USDT on Solana (6 dec.). Decimals are handled per (chain, token) — the mistake that costs 10¹² units, avoided.
Every step is idempotent and observable. If something fails, it stops and alerts — it never moves funds blindly.
POST /paymentsWe return a unique depositAddress and an expiresAt. The wallet stays in AWAITING_PAYMENT.
USDT or USDC from any wallet — Metamask, Phantom, exchange, hardware. 144 Pay needs no SDK on the user side.
On EVM via getLogs; on Solana via signatures over the ATA. Persisted cursor and N confirmations before marking the payment confirmed.
It sends MATIC/BNB for the ERC-20 transfer or SOL for the SPL transfer, with a safety margin. Serialized queue to avoid collisions.
We re-derive its key in memory and sign a transfer() (ERC-20 or SPL) to your hot wallet. The wallet becomes SWEPT.
It deducts the fee and sends the rest to N destinations. We fire payment.completed to the webhook. State COMPLETED.
Send to multiple recipients in one operation: on Polygon and BSC via our Disperse contract (~50% less gas than N separate transfers), and on Solana via batched SPL transfers. Same API key, same webhook model.
The Disperse contract executes up to 200 transfers in a single tx.
Measured on-chain: a batch of 10 pays 153k gas vs 350k for 10 separate transfers.
Disposable wallet per dispersion; funds spend less than 1 minute in custody.
Auditable in 30 seconds. No one can drain it or freeze it.
dispersion.deposit_received, dispersion.completed, etc.
Deployed contracts:
Polygon · 0xDaC2…6981
BSC · 0x9416…04a6
# Pagar a 3 destinos en una sola tx $ curl -X POST https://144pay.com/api/v1/dispersions \ -H "X-API-Key: pk_live_xxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "chain": "polygon", "token": "USDT", "reference": "payout_001", "destinations": [ { "address": "0xA1...", "amount": "50.00" }, { "address": "0xB2...", "amount": "75.00" }, { "address": "0xC3...", "amount": "30.00" } ] }'
const disp = await fetch('https://144pay.com/api/v1/dispersions', { method: 'POST', headers: { 'X-API-Key': process.env.PAY144_KEY, 'Content-Type': 'application/json', }, body: JSON.stringify({ chain: 'polygon', token: 'USDT', destinations: recipients.map(r => ({ address: r.wallet, amount: r.amount, })), }), }); const { data } = await disp.json();
{
"success": true,
"data": {
"id": "d_8a3f...",
"status": "AWAITING_DEPOSIT",
"chain": "polygon",
"depositAddress": "0x4f...e2",
"totalToDeposit": "156.55",
"expiresAt": "2026-05-23T17:00:00Z"
}
}
OpenAPI spec generated from the code — always in sync. Signed webhooks, idempotency-key, typed errors.
Interactive documentation at /docs, browsable and always up to date.
Retry payment creation without fear of duplicates.
Verify the signature with your webhook_secret and reject spoofing.
Generate and revoke keys from the admin panel. Hashed with argon2.
# Crear cobro $ curl -X POST https://144pay.com/api/v1/payments \ -H "X-API-Key: pk_live_xxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: ord-991" \ -d '{ "reference": "ord-991", "chain": "polygon", "token": "USDT", "amount": "250.00" }'
const res = await fetch('https://144pay.com/api/v1/payments', { method: 'POST', headers: { 'X-API-Key': process.env.PAY144_KEY, 'Content-Type': 'application/json', 'Idempotency-Key': order.id, }, body: JSON.stringify({ reference: order.id, chain: 'polygon', token: 'USDT', amount: order.total, }), }); const { data } = await res.json();
import requests, os res = requests.post( 'https://144pay.com/api/v1/payments', headers={ 'X-API-Key': os.environ['PAY144_KEY'], 'Idempotency-Key': order.id, }, json={ 'reference': order.id, 'chain': 'polygon', 'token': 'USDT', 'amount': str(order.total), }, ) deposit_address = res.json()['data']['depositAddress']
// Verificar webhook entrante (Express) import { createHmac, timingSafeEqual } from 'crypto'; app.post('/webhooks/144pay', (req, res) => { const sig = req.headers['x-signature']; const expected = 'sha256=' + createHmac('sha256', SECRET) .update(JSON.stringify(req.body)) .digest('hex'); if (!timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) { return res.status(401).end(); } res.status(200).end(); });
Three plans to scale from your first payment to enterprise volume.
For your first payments.
For merchants with real volume.
Tailored, with dedicated KMS.
Assisted onboarding: we review your case, set up your account and hand you your API key. No card, no commitment.