Limits are configured per program at your request. The limits endpoint (
GET /v1/limits) is enabled per tenant. Contact your Rain account manager to enable the endpoint and to set or change limits.How you set limits
You set limits for your program by asking Rain. Message your Rain account manager with the limits you need. Each limit combines the following dimensions:
Each limit applies to one account. For consumer accounts that is the individual user. For corporate accounts it is the company, so all of its users share one limit. You can set a default for every account and override it for individual accounts.
Limits are always denominated in USD. Other currencies are counted after conversion to USD using the exchange rate applied to the transfer: the rate on the quote for quote-based transfers, or the rate on the transfer for payment-route deposits. The converted amount is rounded up to the cent.
Where a limit shows up in the API
Payment-route deposits are checked when the funds arrive, because the amount is unknown until then. Transfers are checked when you create them, because the quote fixes the amount.A transfer that exceeds a limit
POST /v1/quotessucceeds. Quotes are not checked against limits.POST /v1/transfersis rejected with400 Bad Request. The message states the remaining allowance. No transfer is created and nothing is counted against usage.
pending or awaiting_transfer will not be refunded for a limit.
A payment-route deposit that exceeds a limit
A payment-route deposit is checked after its transfer transaction is created, so a transfer inpending or processing can still be refunded for a limit.
- The transfer transaction is created (
transactionTransfer.created). - Rain returns the funds. While the return is in progress the transfer shows
pending_revieworprocessing. Fiat onramp deposits go back to the originating bank account, and stablecoin deposits go to the payment route’srefundAddress. - The transfer moves to
refunded. You receive atransactionTransfer.updatedwebhook, andGET /v1/issuing/transactionsreturns the same status.
pending_review while Rain holds it for a compliance review. Treat pending_review as in progress, not as a failure: the transfer returns to processing when released, or moves to refunded if Rain returns the funds.
Read a user’s remaining limit
CallGET /v1/limits?userId= to show a user how much they can still move today. Each returned limit carries the ceiling (amount) and its interval. A daily limit also carries what has been used in the current window (used) and when the window resets (windowResetAt). A per-transaction limit omits those fields because it keeps no running usage. Amounts are decimal strings in the currency’s major units. Windows reset at midnight in a fixed UTC-5 zone with no daylight-saving adjustment, so windowResetAt is always 05:00 UTC.
Response
limits array means no daily or per-transaction limit is configured for the user. Rain’s compliance and risk controls still apply to every deposit.
Best practices
- Warn before the deposit is sent. Call
GET /v1/limitswhen you display deposit instructions and check every limit whoselimitTypematches the direction: compare the deposit’s approximate USD value withamountminususedfor a daily limit, or withamountfor a per-transaction limit. Show the userwindowResetAtif they need to wait. - Explain refunds. When a transfer reaches
refunded, tell the user the funds are on their way back and when they can try again. - Make sure the
refundAddresson every offramp payment route is a wallet your user can access, so a returned stablecoin deposit lands somewhere they can reach.
What’s next
Transfer webhooks
Payload fields and status values for
transactionTransfer events.Onramps
Create payment routes for fiat deposits.