SET Merchant API · Recipients & payouts
Pay a recipient
POST/v1/payouts
One payout from a customer's custodial wallet to one of its recipients: to a bank in its currency and rail, to a wallet, to another customer's wallet, or to an email. SET's fee is the key's developer fee, and at least 1.00 must reach the recipient. The Travel Rule data goes with it: the customer as originator, the recipient as beneficiary.
Headers
Idempotency-Keystring- Optional. The same key and body run once; a replay answers with
Idempotent-Replayed: true. Kept 24 hours.
Body
walletstringrequired- The paying customer's wallet (
POST /v1/wallets). It must hold the amount, less payouts already queued. recipientstringrequired- One of that customer's recipients.
amountdecimal stringrequired- USDC, whole cents.
referencestring- Bank payouts only, sent to the bank and never stored: ACH 10 letters, digits or spaces; wire 140; SEPA 6–140; SPEI, Pix and Faster Payments the rail's own.
externalIdstring- Your id; a retry with the same one returns the same payout.
platformFeeBpsinteger- Platform keys: the platform's own fee, in basis points, once SET allows it.
Notes
- States follow the provider's transfer, forward only. Events
payout.created,payout.<state>,payout.create_failed, and for live crypto payoutspayout.delivered,payout.chain_mismatchorpayout.chain_failedonce the chain is read.paidToBankis true atpayment_processedon a bank rail;deliveredonly when the chain agrees. - A refused payout answers
502with the payout increate_failedanderror: "payout_refused"; nothing left the wallet. - SET re-reads any payout no webhook has moved for 15 minutes. SET's operator cannot pay out (
403 operator_cannot_pay_out).
Errors
400 amount_invalid400 amount_too_small400 reference_invalid400 external_id_invalid400 recipient_other_customer404 recipient_unknown404 wallet_unknown409 recipient_disabled409 recipient_incomplete409 payee_not_ready409 balance_too_low409 initiation_required403 operator_cannot_pay_out403 platform_fee_not_allowed503 bridge_wallets_disabled502 payout_refused401 api_key_required401 api_key_invalid401 api_key_wrong_mode403 scope_missing429 rate_limited