Add External Banking Account Number - Payee
This endpoint allows an authenticated user to register an external bank account as a payee for funds movement before the account has been fully verified. The account is stored immediately but remains in an unverified state until the user completes a separate verification step. Once verified, the external account becomes eligible for ACH transfers and other payment operations.
Endpoint
POST /api/fundsMovement/v2/connectNonVerifiedExternalBankAccount
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 wants to link an external bank account as a payee but the account has not yet undergone micro-deposit or other verification. This is typically the first step in a two-phase flow: connect the account now, then verify it later before initiating any transfers. This approach allows the payee relationship to be established immediately while deferring the verification ceremony to a convenient time.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| routingNumber | string | Yes | ABA routing number of the external bank. Minimum 1 character. |
| accountNumber | string | Yes | Account number at the external bank. Minimum 1 character. |
| name | string | Yes | Friendly display name for this external account / payee. Minimum 1 character. |
| bankAccountType | string | Yes | Type of bank account. Allowed values: SAVINGS or CHECKING. |
| oneTimeCode | string | Yes | 6-digit numeric one-time verification code used to authorize this operation. Must match pattern ^\d{6}$. |
| secureOperationType | string | Yes | Method used to deliver the one-time code. Allowed values: ShortMessageCode, TimeBasedCode, LegacyTimeBasedCode. |
{
"routingNumber": "021000021",
"accountNumber": "XXXXXXXXXX",
"name": "Acme Corp Operating Account",
"bankAccountType": "CHECKING",
"oneTimeCode": "847293",
"secureOperationType": "ShortMessageCode"
}Response
200 OK
| Field | Type | Description |
|---|---|---|
| mainNode | object | Contains the result of the add-account operation. |
| mainNode.typename | string | GraphQL type name of the returned node. |
| mainNode.id | string | Unique identifier assigned to the newly created external bank account record. |
| mainNode.name | string | Display name of the external account as stored. |
| mainNode.externalBankAccountDetails | object | Low-level details of the linked bank account. |
| mainNode.externalBankAccountDetails.last4 | string | Last 4 digits of the account number. |
| mainNode.externalBankAccountDetails.type | string | Account type as recorded (SAVINGS or CHECKING). |
| mainNode.externalBankAccountDetails.routingNumber | string | Routing number of the external institution. |
| mainNode.externalBankAccountDetails.accountNumber | string | Full account number (handle with care; mask in logs). |
| mainNode.externalBankAccountDetails.createdAt | string (date-time) | Timestamp when the account details record was created. |
| mainNode.externalBankAccountDetails.updatedAt | string (date-time) | Timestamp when the account details record was last updated. |
| mainNode.accessDeniedErrorMessage | string | Populated when the caller lacks permission; otherwise null. |
| mainNode.createdAt | string (date-time) | Timestamp when the external account node was created. |
| mainNode.updatedAt | string (date-time) | Timestamp when the external account node was last updated. |
| mainNode.errors | array | List of mutation errors on the node, if any. |
| mutationResult | object | Top-level mutation outcome. |
| mutationResult.errors | array | List of user-facing errors from the mutation. Empty on success. |
| mutationResult.errors[].path | array of strings | JSON path identifying the field that caused the error. |
| mutationResult.errors[].code | string | Machine-readable error code. |
| mutationResult.errors[].description | string | Human-readable description of the error. |
{
"mainNode": {
"typename": "AddNonVerifiedExternalUSFinancialBankAccount",
"id": "ext-acct-7f3a2b9c-1d45-4e78-b012-abc123def456",
"name": "Acme Corp Operating Account",
"externalBankAccountDetails": {
"last4": "6789",
"type": "CHECKING",
"routingNumber": "021000021",
"accountNumber": "XXXXXXXXXX",
"createdAt": "2026-06-08T14:22:10Z",
"updatedAt": "2026-06-08T14:22:10Z"
},
"accessDeniedErrorMessage": null,
"createdAt": "2026-06-08T14:22:10Z",
"updatedAt": "2026-06-08T14:22:10Z",
"errors": []
},
"mutationResult": {
"errors": []
}
}Error Codes
| Code | When it happens |
|---|---|
| 400 | Missing required fields, invalid bankAccountType value, or oneTimeCode does not match the 6-digit pattern |
| 401 | Bearer token is missing, expired, or invalid |
| 403 | Authenticated user does not have permission to add external bank accounts |
| 409 | The external bank account has already been linked to this customer |
| 500 | Internal server error while processing the request |
Common Mistakes
- Providing a
bankAccountTypevalue other than the exact stringsSAVINGSorCHECKING(the field is case-sensitive and validated against that pattern). - Sending a
oneTimeCodethat is not exactly 6 digits or contains non-numeric characters — the pattern^\d{6}$is strictly enforced. - Attempting to use the newly added external account for a transfer immediately; the account must complete verification first before it can be used for funds movement.
- Omitting
secureOperationTypeor using a value not in the allowed enum (ShortMessageCode,TimeBasedCode,LegacyTimeBasedCode). - Logging or storing the raw
accountNumberin plaintext; always mask asXXXXXXXXXXin logs and audit trails.
Related Endpoints
POST /api/fundsMovement/v2/connectExternalBankAccount— Connect and verify an external bank account in a single step using Finicity or PlaidGET /api/fundsMovement/v2/getExternalBankAccounts— Retrieve all external bank accounts linked to the authenticated customerDELETE /api/fundsMovement/v2/removeExternalBankAccount— Remove a linked external bank accountPOST /api/fundsMovement/v2/transferToExternalBankAccount— Initiate an ACH transfer to a verified external bank account
Example
curl -X POST https://api.banking.netevia.dev/api/fundsMovement/v2/connectNonVerifiedExternalBankAccount \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"routingNumber": "021000021",
"accountNumber": "XXXXXXXXXX",
"name": "Acme Corp Operating Account",
"bankAccountType": "CHECKING",
"oneTimeCode": "847293",
"secureOperationType": "ShortMessageCode"
}'