Bulk payouts
Pay many handles in one reviewed batch: weekly referral rewards, leaderboard prizes, contributor payroll. Every row is validated before anything moves, and invalid recipients are blocked — never skipped silently.
1 · Validate
/v1/payments/bulkscope payments:createValidation resolves every handle, checks amounts and assets, flags duplicates and lookalikes, and totals the payable rows. Nothing is paid.
payments[]array ≤ 1,000requiredrecipient(@mia),amount(decimal string),asset, optionalnote.vault_idstringoptional- The Reward Vault that pays. API batches execute from a vault; a batch with
source: "wallet"is reviewed and paid by a person in the dashboard instead. source"vault" | "wallet"optional- Implied
vaultwhenvault_idis set. namestringoptional- Shown in the dashboard and on receipts.
Idempotency-Keyheaderoptional- Same key + same rows → the same batch, so a retried job never creates a second one.
Each row carries its identity_state and, when it can't be paid, an error_code and a plain-language error_message: RECIPIENT_NOT_FOUND, NO_PAYOUT_DESTINATION, RECIPIENT_UNVERIFIED, UNSUPPORTED_NETWORK, UNSUPPORTED_ASSET, DUPLICATE_RECIPIENT … warnings groups rows that need a human look (lookalike handles, recent wallet changes). review_url opens the batch in the dashboard.
2 · Execute
/v1/payments/bulk/{batch_id}/executescope payments:createon_invalid"remove" | "defer"optional- Required when any row is invalid.
removedrops those rows;deferkeeps them on the batch to pay later once the recipient is ready. confirmationsobjectoptionalsimilar_handle_acknowledged,recent_change_acknowledged,new_recipient_acknowledged— for rows the risk engine flagged.
Execution returns 202 and runs in the background: each payable row becomes a BULK payment from the vault and is tracked like any other payment — payment.* webhooks fire per row, with bulk_batch_id set. The batch ends COMPLETED, or PARTIAL if some rows failed or were deferred.
Executing a batch with undecided invalid rows is refused:
3 · Track
/v1/payments/bulk/{batch_id}scope payments:readReturns the batch with per-row payment_id, payment_status and tx; paid_totals sums what has confirmed.
CSV
The dashboard (Bulk) imports the same rows from CSV — handle,amount,asset,note, header optional, any column order — validates them with the same rules, and lets a person remove or defer invalid rows before paying from a vault or their own wallet.