---
title: "Bank payouts"
description: "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](/recipes/remittance-and-crypto/overview).

**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](/recipes/bank-payouts/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](/recipes/bank-payouts/pay-a-us-bank-account-by-ach) |
| Pay a large US amount the same day | `wire` | [Send a same-day US domestic wire](/recipes/bank-payouts/send-a-us-domestic-wire) |
| Pay a US account instantly from a bank-held USD account | `rtp` | [Pay a US bank account instantly by RTP](/recipes/bank-payouts/pay-a-us-bank-account-by-rtp) |
| Pay the same US account on two rails | `ach` and `wire` | [Save one US account for both ACH and wire](/recipes/bank-payouts/save-one-account-for-two-rails) |
| Pay a company abroad in USD, with an invoice | `swift` | [Pay a supplier abroad by SWIFT](/recipes/bank-payouts/pay-a-supplier-abroad-by-swift) |
| Pay a person abroad in USD, and answer a document pause | `swift` | [Pay a person abroad by SWIFT](/recipes/bank-payouts/pay-a-person-abroad-by-swift) |
| Pay a euro IBAN | `sepa` | [Pay a euro account by SEPA](/recipes/bank-payouts/pay-a-euro-account-by-sepa) |
| Pay a UK sort code and account number | `fps` | [Pay a UK account by Faster Payments](/recipes/bank-payouts/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](/recipes/bank-payouts/fix-a-payee-that-failed-setup) |
| A transfer paused for a limit or for sender details | [Stay within transfer limits](/recipes/bank-payouts/stay-within-transfer-limits) |
| You want to follow a payout to the end, including failures, returns and manual review | [Follow a payout to completion](/recipes/bank-payouts/follow-a-payout-to-completion) |

## Which source account can pay which rail

Read the source with [`GET /v2/accounts/{id}`](/api-reference/accounts-v2/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](/getting-started/payments-and-supported-countries#pay-out-coverage).

## Rules every recipe relies on

- Send every request to `https://api.gravv.xyz` with your key in the `Api-Key` header. A key that starts with `grvSec_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 `rail` inside the `destination` object.
- An HTTP 200 does not always mean the money is on its way. Read `transfer_status`, which is `pending` or `paused`.
- Most errors return HTTP 400 with the reason in `error`. Some errors also carry a `code`. Match on the message.
- Deduplicate webhooks on the `event_id` in the body, never on `X-Event-ID`.
