---
title: "Create a bank transfer"
method: POST
path: "/api/tradfi/v1/bank-transfers"
tags: ["ACH Debits"]
---

# Create a bank transfer

`POST /api/tradfi/v1/bank-transfers`

Creates a new bank transfer using the `walletId` and
`bankAccountId` as counterparties. Most details are inferred
from `bankAccountId`. The `walletId` and `bankAccountId`
must be owned by the same `enterpriseId`.

**Requires access token scope:** `wallet_spend_all`

## Request body

- CreateBankTransferRequest — Exactly one of `amount` or `baseAmount` must be provided. Providing both or neither will return a 400 error.
  - `acceptAuthTerms` boolean, required — Whether the client has accepted the ACH authorization terms. Required for deposits (`transferDirection: "in"`). Must be `true` to initiate a deposit. Retrieve the authorization language to present to the user via `GET /api/tradfi/v1/enterprises/{enterpriseId}/ach-authorization`.
  - `amount` string — The absolute value of the total amount of funds to be transferred as a decimal string (e.g., "500.00" for $500 USD). Include decimal places where applicable. Mutually exclusive with `baseAmount`.
  - `applyInstantCredit` boolean — Whether to apply instant credit to the transfer.
  - `bankAccountId` string, required — The bank account to use. Determines the bank rails. Presently, only ACH accounts are supported.
  - `baseAmount` string — The transfer amount in the currency's smallest unit as a string (e.g., "50000" for $500.00 USD, where the base unit is cents). The value is converted to a decimal using the currency's unit precision (e.g., 2 for USD, 0 for JPY). Mutually exclusive with `amount`.
  - `id` string, required — Client-generated transfer ID. Serves as the idempotency key. Prefer UUID v4, v5, or v7.
  - `transferDirection` 'in', required
  - `walletId` string, required — The Go Account wallet to use as counterparty.

## Response `201`

Created

- BankTransferResponse
  - `amount` string, required — The absolute value of the total amount of funds to be transferred to or from the related bank. Always returned as a decimal string with the currency's full precision (e.g., "500.00" for USD), regardless of whether the request used `amount` or `baseAmount`.
  - `applyInstantCredit` boolean, required — Whether to apply "instant credit" to the transfer. This allows funds to be made available to customer from the CaaS reserve account if they are available.
  - `bankAccountId` string, required — The bank account used for the transfer. This also determines the bank rails used for the transfer.
  - `counterparty` object, nullable — Information about the counterparty of the transfer. The available fields vary by bank rail and region (e.g. name, financial institution, country). The counterparty account number is masked, exposing only the last four characters (e.g. "*****7890"). Null until counterparty details are available, typically once the transfer has settled.
  - `createdAt` string, date-time, required — When the transfer was created/initiated.
  - `enterpriseId` string, required — The enterprise related to the transfer. Determined automatically by the walletId.
  - `estimatedEffectiveOn` string, date, nullable, required — The date when the transfer is expected to become "effective" or "posted" by the related bank. Without instant credit this will usually be either T+1 or T+4 depending on risk profile of the related enterprise and bank account. Null when not yet determined.
  - `id` string, required — The ID of the transfer. This should be generated by the client (prefer v4, v5, or v7) because it also serves as the idempotency key. Using an automatically generated ID provides no idempotency guarantees.
  - `instantCreditLiability` boolean, required — Whether the current transfer counts against the CaaS reserve for instant credit. Only applies to transfers that opted for applyInstantCredit and have not yet settled. Once settled, transitions to false.
  - `memoId` string, required — An automatically generated memo used for matching with bank transfers. Informational only.
  - `settledAt` string, date-time, nullable, required — When the transfer was settled (posted by the bank). Null until status is settled.
  - `status` 'initiated' | 'processing' | 'settled' | 'reversed' | 'failed', required — The status of a transfer. `initiated` means newly created and not yet completed processing. `processing` means currently processing with bank providers with funds in flight. `settled` means funds successfully processed and no longer flagged as instantCreditLiability. `reversed` means a previously settled transfer was reversed by the processor. `failed` means an unrecoverable error occurred before settlement.
  - `transferDirection` 'in', required
  - `transferType` 'ach-us', required
  - `txid` string, required — The transaction ID correlated with wallet platform. Can also be used in GET requests as an identifier.
  - `walletId` string, required — The wallet (Go Account) used as counterparty to the transfer. Also determines the related enterprise.

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `404` — Not Found
- `500` — Internal Server Error

---

[API](https://skmtc.net/bitgo/apis/bitgo-api.md) · [All operations](https://skmtc.net/bitgo/apis/bitgo-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/bitgo/bitgo-api/revisions/e445c15e5bee/schema)
