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
| Field | Type | Required | Description |
|---|---|---|---|
| fromFinancialAccountId | string | Yes | The ID of the Netevia financial account from which funds will be withdrawn. Minimum length: 1. |
| toFinancialAccountId | string | Yes | The ID of the destination financial account (linked external account). Minimum length: 1. |
| amount | integer (int32) | No | Transfer amount in the smallest currency unit (e.g., cents for USD). Value must be between 1 and 4294967295. |
| currencyCode | integer (int32) | No | ISO 4217 numeric currency code. Supported value: 840 (USD). |
| oneTimeCode | string | Yes | Six-digit numeric verification code used to authorize the transfer (e.g., from SMS or authenticator app). Must match pattern ^\d{6}$. |
| secureOperationType | string | Yes | The type of verification used to generate the one-time code. Allowed values: ShortMessageCode, TimeBasedCode, LegacyTimeBasedCode. |
| memo | string | No | Optional 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
| Code | When it happens |
|---|---|
| 400 | Missing required fields, invalid field values, malformed one-time code (not 6 digits), or amount out of range |
| 401 | Token missing, expired, or invalid |
| 403 | Insufficient permissions or one-time code verification failed |
| 404 | fromFinancialAccountId or toFinancialAccountId not found |
| 500 | Internal server error |
Common Mistakes
- Providing an
amountof0— the minimum accepted value is1(representing 1 cent if currency is USD). - Sending a
oneTimeCodethat 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
toFinancialAccountIdthat 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
secureOperationTypewith the actual method used to generate theoneTimeCode— ensure the type matches how the code was delivered or generated. - Omitting the
currencyCodewhen an explicit currency is required by your integration — defaulting behavior may vary; always specify840for USD transfers.
Related Endpoints
POST /api/auth/v2— Obtain a Bearer token for authenticationPOST /api/auth/refresh— Refresh an expiring Bearer tokenGET /api/fundsMovement/v2/ACHTransfer/{transferId}— Check the status of a submitted ACH transferPOST /api/fundsMovement/v2/internalTransfer— Transfer funds between a customer's own Netevia accounts without ACHGET /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"
}' 200Success
