Skip to main content
To fund an account, send a supported token to the account’s deposit address for the relevant chain. Unsupported tokens will not count toward the spending balance. They remain in the account and can be withdrawn.
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:
  1. The system detects the on-chain transfer and creates a deposit in PENDING status.
  2. Once the transaction is finalized on-chain, the deposit moves to CONFIRMED.
  3. The deposit is validated.
  4. If validation passes, the deposit is APPROVED and the account balance is updated. If validation fails, the deposit is REJECTED.
You receive a CRYPTO_DEPOSIT_CREATED webhook when the deposit is first detected, and a CRYPTO_DEPOSIT_STATUS_UPDATED webhook at each subsequent status change.

Minimum deposit amount

Deposits below USD 0.50 are rejected with a REJECTED 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, call GET /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:
AssetMinimum per deposit
USDC2 USD
USDT2 USD
Deposits below the floor are 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

  1. Create an account and retrieve its deposit address for Ethereum Sepolia or Solana Devnet.
  2. Send RUSDC or RUSDT from your funded test wallet to that address.
  3. Confirm you receive a CRYPTO_DEPOSIT_CREATED webhook.
  4. 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 show status: APPROVED (it has cleared validation and the balance has updated).
  5. Check the balance endpoint. It should reflect the deposited amount.

Scenario 2: Unsupported token

  1. Send native ETH or SOL to the same deposit address.
  2. Confirm you receive a CRYPTO_DEPOSIT_CREATED webhook confirming the transfer was detected.
  3. Confirm a CRYPTO_DEPOSIT_STATUS_UPDATED webhook with status: REJECTED. Unsupported tokens are rejected immediately on detection, without going through on-chain finalization.
  4. Check the assets endpoint to confirm the token appears there, and check the balance endpoint to confirm it is unchanged.