clock 5-minute read calender updated Dec. 09, 2025

Get immediate confirmation of account ownership

The Account Validation API delivers nearly instant (usually 5 seconds for less) real-time confirmation about account status and ownership, helping you verify the intended counterparty before moving funds. Unlike prenotes or micro deposits that can take days may incur return costs, reduces fraud, minimizes returns, ensures compliance with Nacha rules web debits.

Benefits of KeyBank's Account Validation API:

  • Real-time validation saves time streamlines operations
  • Fraud prevention
  • Pricing per successful transaction

Speak your KeyBank Technical Manager to learn more. Or start onboarding by checking out our Get started.

Account Validation API

Validate account status and ownership in seconds with KeyBank’s Account Validation API—helping you prevent fraud, reduce returns, and move money confidently.

Account validation is simple. You send an request to evaluate the account information of a draft account item, typically a check or an ACH item, and KeyBank returns a response to verify the status and ownership of the account.

Account validation flow steps for submitting a request and getting a response.

01

Authorization

Prepare your environment and have your access token and KeyBank credentials ready.

  • Authorization: Specify the authentication type as a Bearer Token and insert your KeyBank access token. (Learn how to get an access token.)
  • secondaryID: This is a unique identification assigned by KeyBank to verify you, the client, is making the call. This is not the same as your client credentials used to get an access token.

02

Make a request

To send a valid request, satisfy all required parameters.

  • serviceType: The type of request made to the API. This value must be set to 'Owner'.
  • routingNumber: The routing number of the bank account holder.
  • accountNumber: The bank account number of the account owner.

Account owner details

For stronger verification, include as many details as possible in the AcctOwner object when requesting validation. The API checks the information you provide against the National Shared Database (NSD). Fields left blank won’t be reviewed, so the more data you include, the more accurate the match.

Search conditions

You can search by a person or a business, but not both.

  • A personal inquiry validates an account with the owner's full name. (firstName + lastName)
  • A business inquiry validates an account with a business name, company name, or the full name of the individual. (businessName)

03

AOA

KeyBank performs Account Ownership Authentication (AOA) to verify account details against the National Shared Database (NSD). It checks the payer’s name, address, and other key elements, then returns whether the individual or business is authorized to transact on the account.

Note, during verification of the request, the case, spacing, and punctuation are ignored when matching values. 

04

Validation response

The response returns codes that inform you of whether or not this is a genuine account. Pay attention to these codes in the response:

  • a condition code telling you the state of the account owner data provided.
  • match codes that confirm the data is the found or not with a Y (Yes), N (No), C (Conditional), or U (Unknown).
  • an overall match score is generated based on number of data points that did and did not match. If most of the match codes are Y, you will have a higher match score.

How you evaluate response codes depends on your business needs. KeyBank provides guidelines to help you interpret results. We recommend reviewing these items in order:

  1. Verify request. Check the errorCode to make sure there are no errors. A value of three zeroes (000) means the request was successful and well-formed.
  2. Check account status. Review the primaryStatusCode and message for the current condition of the account.
  3. Confirm account activity. The conditionCode tells if account could be located and if it is open.
  4. Review data matches. Look at the overallMatchScore and match details from the AcctOwner owner object.

The errorCode field contains a three-digits code indicating any issues with the request or account information.

If no errors are present, this field is filled with three zeroes (000). Other codes specify the problem (see table below).

System error codes
CODEDESCRIPTION
000Normal response - no errors
001Invalid routing number
003Invalid account number
005Invalid serial number
006Missing a required field
008Length of account number is incorrect
010Inquiry field length too short
011Inquiry field length too long
013Invalid amount field
103Client ID does not match
104Improper data type or value
105Bad layout or format
106Missing client record ID
107Invalid required format
997Authorization unavailable
998System failure
999Timeout

The account status object (AcctStatus) returns a three-digit code for the current condition of the account. 

  • primaryStatusCode: Indicates if the account is open, closed, or not found.
  • primMessage: Provide additional details/
CODEMESSAGE
000No information about the account can be located.
012Account is closed.
096No positive or negative information in known about the account.
099Account is present in the participant’s master account file and has no other status code.
699Account is open and valid account.

Condition codes help determine if the account can be validated fully or partially. Use the conditionCode with other match indicators to set your own acceptance thresholds. 

CODEMESSAGE
000Normal response - no system errors.
300Valid routing number, but not a participant.
301Valid participant, but not an account owner authentication contributor.
302Valid participant, but account owner authentication data is unavailable.
304No name field populated - first, last, or business name.
396No known information for the account number.
900/901No account owner response requested or provided. 

The overall match score (overallMatchScore), from 1-100, reflects how closely the provided data matches the NSD. 

This score is generated based on number of data points that did and did not match. A higher match score indicates a stronger match. KeyBank recommends a match score threshold of 81 and above. 

Match codes for attributes

The system analyzes the data points you provide, so the more details included in your inquiry, the stronger the validation. Minor discrepancies—such as misspellings or incorrect phone numbers—can affect the match score. Note that case, punctuation, and spacing are ignored during verification. The API compares the AcctOwner attributes in your request against the National Shared Database (NSD) and returns match results.

The AcctOwner response object can contain several fields that end in "Match". Each of these match fields contains a single-character code that signifies whether or not an account owner element was found. You can get a confirmation of: Y (Yes), N (No), C (Conditional), or U (Unknown).

CODEDESCRIPTIONAPPLIES TO
YClose or exact matchfirstNameMatch, lastNameMatch, middleNameMatch, namePrefixMatch, nameSuffixMatch, stateMatch, ssnMatch (if the last four digits are provided in the request), idType, idState
NNo matchfirstNameMatch, lastNameMatch, middleNameMatch, namePrefixMatch, nameSuffixMatch, stateMatch, ssnMatch (if the last four digits are provided in the request), idType, idState
CConditional matchnameMatch, businessNameMatch, addressMatch, cityMatch, zipCodeMatch, homePhoneMatch, workPhoneMatch, ssnMatch (if nine digits are provided in the request), dobMatch, idNoMatch
UNo identifying data is available

Applies to all fields

If you get a U with the businessNameMatch it could indicate that the routing and account numbers have been found in the database, but there is no business name associated with the account.