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.
POST /v1/payout with one destination — for affiliate payouts, freelancer payment, customer refund.LIVEPOST /v1/payout/batch with an array of destinations — hundreds in one atomic request, one idempotency key.LIVEscheduled_for field — fires at a future timestamp. Dashboard shows pending queue until execution.LIVE/dashboard/settings/auto-withdraw; fires when balance crosses.LIVEPOST /v1/payment/:track_id/refund — pays back the original sender, reverses your balance, fires refund webhook.LIVEinsufficient_balance if underfunded — no race window.DEBITEDwithdrawals queue. Worker picks up under Redis hotwallet:COIN lock.ENQUEUEDpayout.confirmed webhook with deterministic event_id + Ed25519 receipt.CONFIRMEDpayout.failed webhook fires with reason.FAILED// 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] }
client_reference + merchant returns the same payout — never double-pay on retry.LIVEcoin: "BTC_LN", pass a BOLT11 in destination. Sub-second settlement, ~1¢ fees.LIVE/dashboard/settings/auto-withdraw. Sweeps to cold wallet on cross; 30-min cooldown on failure.LIVEGET /v1/payout/:payout_id/receipt.LIVEpayout.failed. No lost funds.LIVEIf 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.
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.
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.
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.
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.
Same API. Idempotent. No retainer. Network-native fees only.