Transfer limits
Read a sender's transfer caps and what is left to send, and know when a transfer will pause.
If your business has a limits policy, each sender has caps in USD: per transfer, daily, weekly, monthly and annual. Gravv does not refuse a transfer over a cap. It returns the transfer as paused, and you handle it as described in Paused transfers. Read the caps before a large payout to know whether it will pause.
Example. Maria has a weekly cap of 2,500.00 USD and has sent 2,200.00 USD this week, so 300.00 USD is left. You send 1,500.00 USD. The transfer pauses with breached_window weekly and remaining_usd 300.00. If requirements offers it, you can resume it with stronger sender verification. You can also send 300.00 USD instead, or let it expire. If it expires, Gravv refunds the fee.
Read a customer's limits
Send GET /v1/customers/{customer_id}/limits.
curl --request GET \
--url https://api.gravv.xyz/v1/customers/7c9e6679-7425-40de-944b-e07fc1f90ae7/limits \
--header 'Api-Key: <API_KEY>'
{
"data": {
"subject_type": "customer",
"subject_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"tier_code": "basic",
"tier_assignment": "kyc",
"caps_basis": "tier",
"mode": "enforce",
"blocked": false,
"usage_available": true,
"as_of": "2026-10-13T09:15:22Z",
"windows": {
"per_transfer": { "cap_usd": "2000.00", "used_usd": null, "remaining_usd": null },
"daily": { "cap_usd": null, "used_usd": "0.00", "remaining_usd": null },
"weekly": { "cap_usd": "2500.00", "used_usd": "2200.00", "remaining_usd": "300.00" },
"monthly": { "cap_usd": "10000.00", "used_usd": "6400.00", "remaining_usd": "3600.00" },
"annual": { "cap_usd": "100000.00", "used_usd": "18000.00", "remaining_usd": "82000.00", "requires_approval": false }
},
"next_tier": null,
"candidate_tiers": null
},
"error": null
}
How to read the response:
- The smallest
remaining_usdis the most this sender can send now (here 300.00, weekly). cap_usdnullmeans that window has no cap.- Amounts are USD. Gravv converts a transfer in another currency to USD first, and some policies count the fee too.
- Weeks are ISO weeks, Monday to Sunday, in UTC.
modesays what the policy does:off(no limits),shadow(Gravv measures usage but nothing pauses) orenforce(transfers over a cap pause).blocked: truemeans the sender cannot send at all. Their transfers return 422ERROR_CODE_SUBJECT_BLOCKED.next_tiershows the caps the sender would get at the next verification level, when there is one.
A 404 not found: no limits policy applies means your business has no limits policy, not "unlimited by tier". A 404 not found: subject means the customer is not one of yours.
Read a remitter's limits
If you send on behalf of end senders and identify them with remitter_verification.remitter_id, Gravv counts their usage per remitter. Read it with GET /v1/limits/remitters/{remitter_id}. The response has the same shape, with subject_type remitter.
curl --request GET \
--url https://api.gravv.xyz/v1/limits/remitters/rem-maria-lopez-01 \
--header 'Api-Key: <API_KEY>'
When a transfer is over a cap
The API returns the transfer as paused, with pause_reason set to the window (per_transfer, daily, weekly, monthly, annual or annual_requires_approval), plus breached_window, remaining_usd, requirements and expires_at. You can:
- Resume it with what
requirementsasks for, such as aremitter_verificationat a higher level. - Contact support if the requirement is
admin_review. Only Gravv can release it. - Let it expire. Send at most
remaining_usdnow and the rest later.
| Response | Why | Fix |
|---|---|---|
422 transfers are not permitted for this sender (ERROR_CODE_SUBJECT_BLOCKED) |
The sender is blocked | Contact support. Do not retry |
503 transfer limits are temporarily unavailable, please retry (ERROR_CODE_LIMITS_UNAVAILABLE) |
Gravv cannot check limits right now | Retry with backoff |
409 client_reference has already been used for a different transfer … (ERROR_CODE_DUPLICATE_TRANSACTION) |
Under an enforced policy, you reused a client_reference with a different body |
Use a new client_reference for each payout |
409 a transfer with this client_reference is still being processed; retry shortly (ERROR_CODE_TRANSFER_IN_PROGRESS, Retry-After: 1) |
You retried while the first request was still running | Wait a second and retry |
400 subject_id "x" is not a customer id |
The id is not a UUID | Send the customer id |
Testing in sandbox
In sandbox, a new customer's policy is in shadow mode, so nothing pauses for a limit. used_usd stays 0.00, because sandbox transfers do not count toward usage. Ask support to set a test policy if you need to test a limit pause.
Related recipe: Stay within transfer limits and answer a pause.