Add external banking account number - Payee

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

FieldTypeRequiredDescription
routingNumberstringYesABA routing number of the external bank. Minimum 1 character.
accountNumberstringYesAccount number at the external bank. Minimum 1 character.
namestringYesFriendly display name for this external account / payee. Minimum 1 character.
bankAccountTypestringYesType of bank account. Allowed values: SAVINGS or CHECKING.
oneTimeCodestringYes6-digit numeric one-time verification code used to authorize this operation. Must match pattern ^\d{6}$.
secureOperationTypestringYesMethod 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

FieldTypeDescription
mainNodeobjectContains the result of the add-account operation.
mainNode.typenamestringGraphQL type name of the returned node.
mainNode.idstringUnique identifier assigned to the newly created external bank account record.
mainNode.namestringDisplay name of the external account as stored.
mainNode.externalBankAccountDetailsobjectLow-level details of the linked bank account.
mainNode.externalBankAccountDetails.last4stringLast 4 digits of the account number.
mainNode.externalBankAccountDetails.typestringAccount type as recorded (SAVINGS or CHECKING).
mainNode.externalBankAccountDetails.routingNumberstringRouting number of the external institution.
mainNode.externalBankAccountDetails.accountNumberstringFull account number (handle with care; mask in logs).
mainNode.externalBankAccountDetails.createdAtstring (date-time)Timestamp when the account details record was created.
mainNode.externalBankAccountDetails.updatedAtstring (date-time)Timestamp when the account details record was last updated.
mainNode.accessDeniedErrorMessagestringPopulated when the caller lacks permission; otherwise null.
mainNode.createdAtstring (date-time)Timestamp when the external account node was created.
mainNode.updatedAtstring (date-time)Timestamp when the external account node was last updated.
mainNode.errorsarrayList of mutation errors on the node, if any.
mutationResultobjectTop-level mutation outcome.
mutationResult.errorsarrayList of user-facing errors from the mutation. Empty on success.
mutationResult.errors[].patharray of stringsJSON path identifying the field that caused the error.
mutationResult.errors[].codestringMachine-readable error code.
mutationResult.errors[].descriptionstringHuman-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

CodeWhen it happens
400Missing required fields, invalid bankAccountType value, or oneTimeCode does not match the 6-digit pattern
401Bearer token is missing, expired, or invalid
403Authenticated user does not have permission to add external bank accounts
409The external bank account has already been linked to this customer
500Internal server error while processing the request

Common Mistakes

  • Providing a bankAccountType value other than the exact strings SAVINGS or CHECKING (the field is case-sensitive and validated against that pattern).
  • Sending a oneTimeCode that 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 secureOperationType or using a value not in the allowed enum (ShortMessageCode, TimeBasedCode, LegacyTimeBasedCode).
  • Logging or storing the raw accountNumber in plaintext; always mask as XXXXXXXXXX in 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 Plaid
  • GET /api/fundsMovement/v2/getExternalBankAccounts — Retrieve all external bank accounts linked to the authenticated customer
  • DELETE /api/fundsMovement/v2/removeExternalBankAccount — Remove a linked external bank account
  • POST /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"
  }'
Body Params
string
required
length ≥ 1
^\d{6}$

Code for passing verification

string
enum
required
Allowed:
string
required
length ≥ 1
string
required
length ≥ 1
string
required
length ≥ 1
string
required
length ≥ 1
SAVINGS|CHECKING
Headers
string
enum
Defaults to application/json

Generated from available response content types

Allowed:
string
enum
Defaults to application/json

Generated from available request content types

Allowed:
Response

Language
Credentials
Bearer
JWT
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
text/plain
application/json
text/json