API
Reward Vaults
A Reward Vault lets your code pay out without FomoPay ever holding your money. The funds stay in a wallet you control; FomoPay may only spend the allowance you approved.
The allowance model
Your vault
Project wallet / Safe
Holds the USDG. You keep custody.
approve(cap)
once, revocable
FomoPay
Payout signer
Can spend at most the remaining allowance — nothing else.
transferFrom
per payout
Recipient
L@lyra
verified payout wallet
- Your wallet holds the funds. The vault is a project wallet — ideally a dedicated wallet or a Safe — holding USDG on Robinhood Chain. FomoPay never takes custody.
- You approve a cap. The vault wallet calls the standard ERC-20
approve(payoutSigner, cap), with the vault's tag appended to the calldata (the dashboard andapprove.datainclude it) — only an approval carrying it activates the vault. That cap is enforced by the USDG contract itself: the payout signer can never move more than what remains of it, and never anything other than USDG from that wallet. - FomoPay pays verified handles only. Each payout is
transferFrom(vault, recipient, amount)to the wallet FomoPay verified for that identity, after the same resolution, snapshot and risk checks as every payment. The signer pays the gas (ETH). - You can stop it any time.
approve(payoutSigner, 0)from the vault wallet revokes FomoPay's access on-chain, immediately, without asking anyone. You can also pause a vault in the dashboard, and withdraw is simply moving USDG out of your own wallet.
on-chain, in plain terms
USDG only
Vaults pay USDG (Global Dollar, 6 decimals, 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168). ETH has no ERC-20 allowance, so it can't be delegated this way — ETH payments go through a wallet payment that a person signs. There is no official USDC on Robinhood Chain.
Limits on top of the allowance
| Control | Where it's enforced | What happens |
|---|---|---|
| Allowance cap | On-chain (USDG contract) | VAULT_ALLOWANCE_EXCEEDED before a payment is created; the chain would refuse it anyway. |
| Balance | On-chain | VAULT_INSUFFICIENT when the wallet's balance, minus payouts in flight, can't cover it. |
| Per-payout limit | FomoPay | PAYMENT_LIMIT_EXCEEDED (details.limit: "PER_PAYOUT"). |
| Daily limit | FomoPay (UTC day) | PAYMENT_LIMIT_EXCEEDED (details.limit: "DAILY"). |
| Approval threshold | FomoPay | Larger payouts wait in PENDING_APPROVAL until a project Finance/Admin approves. |
| Low-balance alert | FomoPay | vault.low_balance webhook when available funds drop below your threshold. |
Set up a vault
- Open Dashboard → Vaults and create a vault: pick the wallet or Safe that will hold the funds, a spending cap and optional limits.
- Approve the payout signer from that wallet (one transaction the dashboard prepares; nothing else is ever requested from it — never a private key or seed phrase).
- Send USDG to the vault wallet. Deposits are detected on-chain; the vault becomes
ACTIVEonce the allowance is confirmed. - Pay from code with
rewards.createorfomopay.send.
List vaults
GET
/v1/vaultsscope vaults:readTypeScript
Retrieve a vault
GET
/v1/vaults/{vault_id}scope vaults:readTypeScript
200 OK
| Field | Meaning |
|---|---|
balance | USDG held by the vault wallet. |
allowance | What remains of the approved spending cap — the most FomoPay can ever move. |
allowance_cap | The cap you last approved. |
reserved | Payouts created but not yet confirmed. |
available | min(balance, allowance) − reserved, never below 0. What new payouts can draw on. |
limits | per_payout, daily, approval_threshold and low_balance_threshold (null = not set). |
status | PENDING_SETUP (approval not confirmed yet) · ACTIVE · PAUSED · REVOKED (allowance set to 0). |
stale | true when Robinhood Chain couldn't be read and the numbers are from the last sync (synced_at). |
Amounts are decimal strings in USDG. Balances are read from Robinhood Chain; if the chain can't be read, payouts are refused with NETWORK_UNAVAILABLE rather than guessed.