Initiate ACH transfer from own account

Initiate ACH Transfer From Own Account

This endpoint initiates an ACH (Automated Clearing House) transfer from a customer's Netevia financial account to a linked external account. The operation requires two-factor verification via a one-time code to authorize the movement of funds. This endpoint is deprecated — use the latest funds movement endpoints for new integrations.

Deprecated: This endpoint has been marked deprecated. Review the related endpoints section for the current ACH transfer workflow.

Endpoint

POST /api/fundsMovement/v2/ACHTransfer

Authentication

Bearer token required. Obtain via:

POST https://api.banking.netevia.dev/api/auth/v2

Include in header: Authorization: Bearer {token}
Token lifetime: 10 minutes. Refresh via POST /api/auth/refresh.

When to use

Use this endpoint when a customer needs to push funds from their Netevia financial account to an external bank account that has been linked via Finicity or Plaid. The transfer requires a one-time verification code to confirm the customer's identity before funds are moved, providing an additional layer of security for outbound ACH transactions.

Request Body

FieldTypeRequiredDescription
fromFinancialAccountIdstringYesThe ID of the Netevia financial account from which funds will be withdrawn. Minimum length: 1.
toFinancialAccountIdstringYesThe ID of the destination financial account (linked external account). Minimum length: 1.
amountinteger (int32)NoTransfer amount in the smallest currency unit (e.g., cents for USD). Value must be between 1 and 4294967295.
currencyCodeinteger (int32)NoISO 4217 numeric currency code. Supported value: 840 (USD).
oneTimeCodestringYesSix-digit numeric verification code used to authorize the transfer (e.g., from SMS or authenticator app). Must match pattern ^\d{6}$.
secureOperationTypestringYesThe type of verification used to generate the one-time code. Allowed values: ShortMessageCode, TimeBasedCode, LegacyTimeBasedCode.
memostringNoOptional memo or note for the transfer. Maximum length: 1024 characters.
{
  "fromFinancialAccountId": "fa_9a8b7c6d5e4f3210",
  "toFinancialAccountId": "fa_ext_1a2b3c4d5e6f7890",
  "amount": 25000,
  "currencyCode": 840,
  "oneTimeCode": "847291",
  "secureOperationType": "ShortMessageCode",
  "memo": "Monthly savings transfer"
}

Response

200 OK

A 200 status indicates the ACH transfer was accepted and queued for processing. The response body is not detailed in the schema; confirm transfer status using the funds movement status endpoints.

{}

Error Codes

CodeWhen it happens
400Missing required fields, invalid field values, malformed one-time code (not 6 digits), or amount out of range
401Token missing, expired, or invalid
403Insufficient permissions or one-time code verification failed
404fromFinancialAccountId or toFinancialAccountId not found
500Internal server error

Common Mistakes

  • Providing an amount of 0 — the minimum accepted value is 1 (representing 1 cent if currency is USD).
  • Sending a oneTimeCode that is not exactly 6 digits — the field pattern requires ^\d{6}$ and any deviation (letters, fewer/more digits) will cause a 400 error.
  • Using a toFinancialAccountId that refers to an account not linked or not yet verified via Finicity or Plaid — external accounts must complete underwriting verification before they can receive ACH transfers.
  • Mismatching secureOperationType with the actual method used to generate the oneTimeCode — ensure the type matches how the code was delivered or generated.
  • Omitting the currencyCode when an explicit currency is required by your integration — defaulting behavior may vary; always specify 840 for USD transfers.

Related Endpoints

  • POST /api/auth/v2 — Obtain a Bearer token for authentication
  • POST /api/auth/refresh — Refresh an expiring Bearer token
  • GET /api/fundsMovement/v2/ACHTransfer/{transferId} — Check the status of a submitted ACH transfer
  • POST /api/fundsMovement/v2/internalTransfer — Transfer funds between a customer's own Netevia accounts without ACH
  • GET /api/financialAccounts — List financial accounts available for the customer

Example

curl -X POST https://api.banking.netevia.dev/api/fundsMovement/v2/ACHTransfer \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "fromFinancialAccountId": "fa_9a8b7c6d5e4f3210",
    "toFinancialAccountId": "fa_ext_1a2b3c4d5e6f7890",
    "amount": 25000,
    "currencyCode": 840,
    "oneTimeCode": "847291",
    "secureOperationType": "ShortMessageCode",
    "memo": "Monthly savings transfer"
  }'
Body Params

Base class for all funds transfer (movement) request.

string
required
length ≥ 1
^\d{6}$

Code for passing verification

string
enum
required
Allowed:
string | null
string
required
length ≥ 1
string
required
length ≥ 1
int32
1 to 4294967295
int32
enum
Allowed:
Headers
string
enum
Defaults to application/json

Generated from available request content types

Allowed:
Response
200

Success

Language
Credentials
Bearer
JWT
LoadingLoading…
Response
Click Try It! to start a request and see the response here!