Bank payouts
Choose the recipe for paying a bank account: US ACH, wire or RTP, SWIFT, SEPA, Faster Payments, moves between own accounts, and what to do after you send.
Use these recipes to pay a bank account. In the US you pay by ACH, wire or RTP. Abroad you pay by SWIFT in USD, in Europe by SEPA in EUR, and in the UK by Faster Payments in GBP.
Each recipe lists what to collect first, which call tells you the required fields, the full requests and responses, and the errors the API returns when something is wrong.
For payouts to local bank accounts and mobile wallets in Africa, Latin America and Asia, and for crypto payouts, see Remittance and crypto.
A money example to keep in mind. Your customer's USD account holds 10,000.00 USD. You pay a contractor 2,500.00 USD by ACH, with a 1.50 USD fee on your plan. Gravv debits the account 2,501.50 USD and the response shows pending. You receive transfer.status.completed when the bank confirms the payment. Each recipe below follows this pattern.
Choose your recipe
| You want to | Rail | Recipe |
|---|---|---|
| Move money between two accounts your customer holds at Gravv | none | Move money between own accounts |
| Pay a US bank account in 1 to 3 business days, at the lowest cost | ach |
Pay a US bank account by ACH |
| Pay a large US amount the same day | wire |
Send a same-day US domestic wire |
| Pay a US account instantly from a bank-held USD account | rtp |
Pay a US bank account instantly by RTP |
| Pay the same US account on two rails | ach and wire |
Save one US account for both ACH and wire |
| Pay a company abroad in USD, with an invoice | swift |
Pay a supplier abroad by SWIFT |
| Pay a person abroad in USD, and answer a document pause | swift |
Pay a person abroad by SWIFT |
| Pay a euro IBAN | sepa |
Pay a euro account by SEPA |
| Pay a UK sort code and account number | fps |
Pay a UK account by Faster Payments |
After you send:
| Situation | Recipe |
|---|---|
A payee is stuck in setup_failed |
Fix a payee that failed setup |
| A transfer paused for a limit or for sender details | Stay within transfer limits |
| You want to follow a payout to the end, including failures, returns and manual review | Follow a payout to completion |
Which source account can pay which rail
Read the source with GET /v2/accounts/{id}. A bank-held account is a real account at a US bank in your customer's name. A wallet-backed account holds its balance as a stablecoin and converts it when it pays out.
| Source account | ACH | Wire (US) | RTP | SWIFT (USD) | SEPA (EUR) | Faster Payments (GBP) |
|---|---|---|---|---|---|---|
| Bank-held USD account | Available | Available | Available | Available to Nigeria. Not yet available elsewhere | Not supported | Not supported |
| Wallet-backed account | Available | Available | Not supported | Not yet available | Available where your business is enabled | Available where your business is enabled |
Gravv does not support CHAPS, FedNow or BACS as rails. For the full coverage list, see Payments and supported countries.
Rules every recipe relies on
- Send every request to
https://api.gravv.xyzwith your key in theApi-Keyheader. A key that starts withgrvSec_sandbox_reaches sandbox. Any other key reaches live. - Every POST needs its own new
Idempotency-Key(except verify and the webhook resend). Gravv replays a 4xx response for 24 hours under its key, so use a new key after you fix a request. - Send amounts as strings with at most 2 decimals, such as
"2500.00". - Put
railinside thedestinationobject. - An HTTP 200 does not always mean the money is on its way. Read
transfer_status, which ispendingorpaused. - Most errors return HTTP 400 with the reason in
error. Some errors also carry acode. Match on the message. - Deduplicate webhooks on the
event_idin the body, never onX-Event-ID.