Quick summary
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.
How it works
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.

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.
Assess the response
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:
- Verify request. Check the
errorCodeto make sure there are no errors. A value of three zeroes (000) means the request was successful and well-formed. - Check account status. Review the
primaryStatusCodeand message for the current condition of the account. - Confirm account activity. The
conditionCodetells if account could be located and if it is open. - Review data matches. Look at the
overallMatchScoreand match details from theAcctOwnerowner object.
Error review
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
| CODE | DESCRIPTION |
|---|---|
| 000 | Normal response - no errors |
| 001 | Invalid routing number |
| 003 | Invalid account number |
| 005 | Invalid serial number |
| 006 | Missing a required field |
| 008 | Length of account number is incorrect |
| 010 | Inquiry field length too short |
| 011 | Inquiry field length too long |
| 013 | Invalid amount field |
| 103 | Client ID does not match |
| 104 | Improper data type or value |
| 105 | Bad layout or format |
| 106 | Missing client record ID |
| 107 | Invalid required format |
| 997 | Authorization unavailable |
| 998 | System failure |
| 999 | Timeout |
Account status
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/
Account status codes
| CODE | MESSAGE |
|---|---|
| 000 | No information about the account can be located. |
| 012 | Account is closed. |
| 096 | No positive or negative information in known about the account. |
| 099 | Account is present in the participant’s master account file and has no other status code. |
| 699 | Account is open and valid account. |
Account condition
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.
Condition codes
| CODE | MESSAGE |
|---|---|
| 000 | Normal response - no system errors. |
| 300 | Valid routing number, but not a participant. |
| 301 | Valid participant, but not an account owner authentication contributor. |
| 302 | Valid participant, but account owner authentication data is unavailable. |
| 304 | No name field populated - first, last, or business name. |
| 396 | No known information for the account number. |
| 900/901 | No account owner response requested or provided. |
Match scores
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).
Match codes
| CODE | DESCRIPTION | APPLIES TO |
|---|---|---|
| Y | Close or exact match | firstNameMatch, lastNameMatch, middleNameMatch, namePrefixMatch, nameSuffixMatch, stateMatch, ssnMatch (if the last four digits are provided in the request), idType, idState |
| N | No match | firstNameMatch, lastNameMatch, middleNameMatch, namePrefixMatch, nameSuffixMatch, stateMatch, ssnMatch (if the last four digits are provided in the request), idType, idState |
| C | Conditional match | nameMatch, businessNameMatch, addressMatch, cityMatch, zipCodeMatch, homePhoneMatch, workPhoneMatch, ssnMatch (if nine digits are provided in the request), dobMatch, idNoMatch |
| U | No identifying data is available | Applies to all fields If you get a U with the |
5-minute read
updated Dec. 09, 2025