BTC$68,420▲ 0.82% / ETH$3,841▼ 0.31% / LTC$94.05▲ 1.14% / SOL$221.60▲ 3.02% / USDT·TRC20$1.0000 / USDC·ERC20$0.9999 / XMR$168.42▼ 0.18% / TON$6.02▲ 0.47% / XRP$2.41▼ 0.09% / GAS·ETH18 gwei / Indicative prices · illustrative ticker / No-KYC · non-pooled · 0.4% flat / BTC$68,420▲ 0.82% / ETH$3,841▼ 0.31% / LTC$94.05▲ 1.14% / SOL$221.60▲ 3.02% / USDT·TRC20$1.0000 / USDC·ERC20$0.9999 / XMR$168.42▼ 0.18% / TON$6.02▲ 0.47% / XRP$2.41▼ 0.09% / GAS·ETH18 gwei / Indicative prices · illustrative ticker / No-KYC · non-pooled · 0.4% flat
OrbChain
UTC 18:47:02 Get started →
Business / Payouts ▓ ONE API · FIVE SHAPES Single · batch · scheduled · auto · refund

One payout.
Or a thousand.

One REST endpoint covers single payouts, batches, scheduled, threshold-triggered auto-withdraws, and refunds. Idempotent on client reference. HMAC-signed success and failure webhooks. Ed25519 settlement receipts on every payout.

Atomic · Auditable · Irreversible on sign
§ Part I / V · Five shapes

Same endpoint.
Five behaviours.

One API contract
Queue-backed, idempotent
SymShapeWhen to use itStatus
1×SinglePOST /v1/payout with one destination — for affiliate payouts, freelancer payment, customer refund.LIVE
n×BatchPOST /v1/payout/batch with an array of destinations — hundreds in one atomic request, one idempotency key.LIVE
⏱Scheduledscheduled_for field — fires at a future timestamp. Dashboard shows pending queue until execution.LIVE
▲Auto-withdrawThreshold-based sweep to your cold wallet. Configure in /dashboard/settings/auto-withdraw; fires when balance crosses.LIVE
↩RefundPOST /v1/payment/:track_id/refund — pays back the original sender, reverses your balance, fires refund webhook.LIVE
§ Part II / V · Mechanism

How a payout
reaches the chain.

Serialized on hot-wallet lock
No nonce races, ever
#StepBehaviourState
01ValidateDestination address format + burn-list + sanction-list check. Amount vs balance. Coin enabled for merchant.QUEUED
02DebitAtomic balance decrement. Throws insufficient_balance if underfunded — no race window.DEBITED
03EnqueueBullMQ withdrawals queue. Worker picks up under Redis hotwallet:COIN lock.ENQUEUED
04BroadcastHot-wallet signs + broadcasts. EVM uses nonce manager; UTXO uses coin-specific UTXO selection.BROADCAST
05NotifyHMAC-SHA512 payout.confirmed webhook with deterministic event_id + Ed25519 receipt.CONFIRMED
×RollbackOn broadcast failure: balance re-credited atomically, payout.failed webhook fires with reason.FAILED
Payout feed · examplePREVIEW
18:47:01✓ CONFIRMED · po_01JR4N0KJF · BTC0.042 BTC
18:46:58✓ CONFIRMED · po_01JR4N0J9Y · USDT_TRC20 batch 42/200$1,200.00
18:46:47→ broadcast · po_01JR4N0F7T · nonce 118pending
18:46:32✓ CONFIRMED · po_01JR4N0D3P · ETH0.18 ETH
18:46:21→ auto-withdraw fired · threshold crossed at $2,400cleared
18:46:10✓ CONFIRMED · po_01JR4N09VZ · SOL0.51 SOL
18:45:44→ refund · po_01JR4N081M · payer 0xabc…$50.00
18:45:31→ webhook delivered · hmac=b71c… · rt=210msOK
§ Part III / V · Integration

Single payout.
Three fields.

Batch + scheduled
Same endpoint, more keys
POST /v1/payoutcurl · 200 OK
// Send 0.05 BTC to a destination.
curl https://orbchain.io/v1/payout \
  -H "payout_api_key: pk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "coin":             "BTC",
    "amount":           "0.05",
    "destination":      "bc1qx…",
    "client_reference": "affiliate_payout_2026_04",
    "callback_url":     "https://shop.example/webhooks/payouts"
  }'

// → 200 OK
{
  "payout_id":   "po_01JR4N0KJF",
  "status":      "QUEUED",
  "event_id":    "01H8KP9M3F…AX2"
}

// — batch variant —
POST /v1/payout/batch  { "coin": "USDT_TRC20",
  "payouts": [{"destination":...,"amount":...}, ...200 entries] }
§ Part IV / V · Capabilities

Every guarantee,
on every shape.

Shared plumbing
Same contract
SymFeatureWhat it doesStatus
IDMIdempotencySame client_reference + merchant returns the same payout — never double-pay on retry.LIVE
LNInstant LightningSet coin: "BTC_LN", pass a BOLT11 in destination. Sub-second settlement, ~1¢ fees.LIVE
AWAuto PayoutThreshold in /dashboard/settings/auto-withdraw. Sweeps to cold wallet on cross; 30-min cooldown on failure.LIVE
SRSigned ReceiptsEd25519 receipt on every CONFIRMED payout at GET /v1/payout/:payout_id/receipt.LIVE
SANCSanction-list checkEvery destination checked against OFAC + our own burn list before broadcast. Rejected pre-debit.LIVE
RBAtomic rollbackBroadcast failure re-credits balance atomically + fires payout.failed. No lost funds.LIVE
§ Part V / V · Questions

Things operators
ask about payouts.

Answered
Links to docs
Q.01What happens if I submit the same payout twice?

If you sent the same client_reference, we return the existing payout unchanged. If you didn't set one, we consider them two distinct payouts and both execute — always set client_reference.

Q.02Do you charge an extra fee on payouts?

Platform fee (0.4%) is taken on the incoming side only. Payouts pass through at network-native cost — we add nothing. Full per-chain schedule at /pricing.

Q.03Batch atomicity — if one destination fails?

Batches are NOT atomic across destinations — each recipient gets its own payout_id that succeeds or fails independently. The batch itself is a grouping + one idempotency key. Useful for dashboards; doesn't change per-recipient semantics.

Q.04Can I cancel a scheduled payout?

Yes, before it executes: DELETE /v1/payout/:payout_id. Balance re-credits atomically. Once broadcast has started, cancellation is impossible — the transaction is on the chain.

Q.05Refund flow — when does it work?

A refund only works on a PAID invoice where the payer's address is known (every chain but Monero, on-chain BTC/ETH with input reconstruction). It debits your balance, broadcasts back to the original sender, and fires payment.refunded.

One payout.
Or a thousand.

Same API. Idempotent. No retainer. Network-native fees only.