In Program-Funded projects, user accounts do not have deposit addresses. Deposits go to the project’s master collateral account, which has its own addresses and follows the same flow described below. User-level spending power is set by posting against each account, not by depositing.
Deposit flow
When you send a supported token to a deposit address:- The system detects the on-chain transfer and creates a deposit in
PENDINGstatus. - Once the transaction is finalized on-chain, the deposit moves to
CONFIRMED. - The deposit is validated.
- If validation passes, the deposit is
APPROVEDand the account balance is updated. If validation fails, the deposit isREJECTED.
Minimum deposit amount
Deposits below USD 0.50 are rejected with aREJECTED status. This threshold exists to prevent dust deposits. We recommend filtering out rejected deposits before displaying deposit history to your users, as low-value rejections add noise to the UI.
Master collateral funding
In Program-Funded projects, the master collateral account is provisioned at project setup. It is the only crypto-holding account in the project, and every authorized card transaction across the program is settled against it. Keep it funded above expected outstanding spend. To find the master account and its deposit addresses, callGET /accounts?ownerType=PROJECT. The response includes deposit addresses per enabled chain, the same as for user accounts in User-Funded projects. The deposit flow above applies unchanged: send a supported stablecoin, wait for the CRYPTO_DEPOSIT_STATUS_UPDATED webhook, and the balance is available once approved.
Per-asset minimum for master deposits
Master deposits enforce a higher floor than user deposits:| Asset | Minimum per deposit |
|---|---|
USDC | 2 USD |
USDT | 2 USD |
REJECTED. The floor is per deposit, not per balance, so a series of smaller deposits is rejected even if their total is above the threshold.
Checking deposit status
Look up a deposit directly using the deposit endpoint. Once a deposit is approved, the balance endpoint will reflect the updated balance.Testing in sandbox
Deposit testing requires real on-chain transactions. There is no simulation shortcut for the deposit flow. You send actual tokens on testnet, and the system processes them end to end. To get sandbox tokens funded to your test wallet, reach out to your Reap contact. See Supported Assets for the token contract addresses on Ethereum Sepolia and Solana Devnet.Scenario 1: Successful deposit
- Create an account and retrieve its deposit address for Ethereum Sepolia or Solana Devnet.
- Send RUSDC or RUSDT from your funded test wallet to that address.
- Confirm you receive a CRYPTO_DEPOSIT_CREATED webhook.
- Wait for CRYPTO_DEPOSIT_STATUS_UPDATED webhooks as the deposit progresses. The first will show
status: CONFIRMED(the transaction has finalized on-chain). The second will showstatus: APPROVED(it has cleared validation and the balance has updated). - Check the balance endpoint. It should reflect the deposited amount.
Scenario 2: Unsupported token
- Send native ETH or SOL to the same deposit address.
- Confirm you receive a CRYPTO_DEPOSIT_CREATED webhook confirming the transfer was detected.
- Confirm a CRYPTO_DEPOSIT_STATUS_UPDATED webhook with
status: REJECTED. Unsupported tokens are rejected immediately on detection, without going through on-chain finalization. - Check the assets endpoint to confirm the token appears there, and check the balance endpoint to confirm it is unchanged.