SETSimple Easy Transactions
SET DocsAPI reference and complianceUpdated 2026-11-10
Browse: SET Direct Deposit API

Recipe: pay from a Payout Safe

SET Direct Deposit API · Recipe, 2026-11-10

The problem

SET credits a payout to your platform, and names your business as its sender, only when it comes from a wallet you registered by signing a message with it. A platform that keeps its USDC at an exchange or a custodian cannot sign from that account. An exchange's withdrawal wallet also sends for many customers, while at SET a wallet belongs to one business (409 sender_taken), so it is never the wallet to register.

The answer: a Safe of your own

Keep a Safe that your own people sign for. Fund it from the exchange, register it once, and pay each batch from it with one signature round.

Steps

  1. Create a Safe on Base, with your own signers as owners.
  2. Get the text to sign. `` GET /api/partner/senders/message?chain=base&address=<your Safe> ` The answer has message and issuedAt`. Register within an hour.
  3. Sign the text with the Safe in the Safe app (a message signed by its owners), then register it: `` POST /api/partner/senders { "chain": "base", "address": "<your Safe>", "issuedAt": "…", "signature": "0x…", "label": "Payout Safe" } ` SET checks the signature by asking the Safe itself on chain (EIP-1271 isValidSignature). The answer shows proof: "eip1271"`. You do this once per Safe.
  4. Resolve the batch. `` POST /api/partner/payees/batch { "chain": "base", "items": [ { "email": "…", "amount": "40.00", "reference": "run-2026-11-a" }, … ] } ` 20 emails a call; add more with POST /api/partner/payees/batch/{id}/items`, up to 5,000 (Batches of up to 5,000).
  5. Download the Safe file. `` GET /api/partner/payees/batch/{id}?format=safe `` A Safe Transaction Builder file with one USDC transfer per payable item.
  6. Fund, sign and execute. Move the batch total in USDC from the exchange to the Safe. In the Safe app, open Transaction Builder, load the file, and have the owners sign and execute it. Keep the transaction hash.
  7. Report the multisend. `` POST /api/partner/payments/batch { "chain": "base", "txHash": "0x…", "batchId": "pbt_…" } ` Payments to wallets SET created for your payees are recorded and become payable_payment.in_wallet`. Payments to Cash-Out Addresses are tracked from the chain without a report.

Why it holds up

  • Every payout from the Safe is credited to your platform. A payout into a payee's Cash-Out Address names your business as its sender in its Travel Rule data.
  • No exchange account is registered, and SET never holds a key to the Safe.
  • One signature round pays the whole batch.

In the sandbox

On staging, steps 2, 4 and 5 run with a self-serve sandbox key. Steps 3 and 6 need a real Safe on Base Sepolia, signed by its owners, and test USDC to send. To try the rest of the flow without a Safe, register an ordinary wallet with a personal_sign signature instead (Sender wallets).