clock 31-minute read calender | updated Sep. 15, 2024

Tips and tricks to leverage the suite of ACH API’s quickly and efficiently

Key takeaways

TL;DR so here are the hits:

  • Use our ACH Origination API to make or collect authorized payments. You can also inquire on the transactions before they are officially submitted for processing.
  • Sometimes we make mistakes. With ACH you can undo a payment typically within a period of 10 minutes from origination.
  • Inquiring minds want to know? Monitor and report on ACH transactions at any point in the payment process.
  • Look at our Webhooks specs to learn more about automatic push notifications for ACH transactions.

Try it out!

Wanna check out our ACH APIs? You first need to complete the KeyBank onboarding process.

Check out our Getting Started Guide or contact a KeyBank Payment Advisor to learn more. 
 

 

With the ACH Origination API, you can originate a credit or debit transaction to an authorized receiver.

See the specs

To make or collect a payment there has to be an authorized agreement between the originator and the receiver. An authorized agreement means that the payee has an agreement with their financial institution or commercial entity that funds can be exchanged between the originator and the receiver.

The ACH Origination API uses only POST methods to generate new ACH transactions. In the request, you indicate if you are pushing or pulling funds and the method of authorization to transfer funds.

  • The creditDebitCode defines the action of the request, if you are taking funds (debit) or receiving funds (credit).
  • The secCode defines the authorized method to transfer funds, like from a corporate account, online account, by phone, etc. There is a path for each SEC code. Use the correct endpoint path and identify the secCode in the request.

All ACH payments, credit or debit, must include a SEC code. The code is implicit in how payment authorization is arranged (by standing, written, oral, online, etc.). A SEC code also helps determine the rules and requirements that apply to the transaction, including timing of settlement and eligibility for same-day processing.

KeyBank allows ACH origination payment types for the following SEC codes: CCD, CTX, PPD, TEL, and WEB.

CCDCorporate Credit or Debit
  • Deposits and withdrawals to corporate accounts.
  • Does not require individual consumer authorization for each payment.
  • Remittance information available with the transaction as an addendum record.
CTXCorporate Trade Exchange
  • One business pays another for goods or services.
  • An electronic payment that includes an invoice (addenda) intended for the receiving financial institution.
PPDPrearranged Payments and Deposits
  • Specify a certain amount to be transferred from one financial account to another.
  • Requires consumer authorization or prearrangement for the payment or deposit to occur.
  • Some examples are direct deposit of payroll, pension, and dividends, or payment of utility bills, mortgages, rent, membership dues, loans and other recurring payments.
TELTelephone
  • Send a payment via the telephone.
  • Must provide verbal consent during the phone call to initiate the payment transaction.
WEBOnline
  • Initiate a transaction through the web or online banking.
  • Requires consumer authorization for the payment or deposit to occur.

Nacha business, not your problem

With ACH, transaction processing happens in real-time while the file processing for Nacha occurs behind the scenes. We follow Nacha standards and recommend there are no more than 100 transactions per request.

The Nacha file format is the standard file format used for ACH electronic fund transfers (EFT) in the United States. Nacha stands for National Automated Clearing House Association, the organization responsible for managing the rules and regulations governing the ACH network in the US. The Nacha file format is used to create batch files that contain multiple transactions, like direct deposits, bill payments, and other types of electronic payments. These files are commonly used by businesses, financial institutions, and other organizations to initiate and process ACH transactions.

An addendum is an ACH record type that carries supplemental data like remittance information. This data may be needed to identify an electronic payment to the receiving financial institution and the payee, or it may contain additional information relating to the prior entry detail record.

This addenda record is optional. It is primarily used for business-to-business transactions, like CCD and CTX.

Addenda record settings and limitations:

  • CCD, PPD, and WEB payment transactions can have one addenda record. The addenda record displays as one line, not to exceed the 88-character limit.
  • A CTX payment transaction can have multiple addenda records, up to 9,999 records to be exact.
  • KeyBank does not allow more than 20 addenda records per request.
  • If you need additional records, there is a different request available to add addenda records and that endpoint is limited to 100 records per request.

To manage the status of the addenda records, our system tracks it for the entire business day. The status changes from Waiting to Completed, indicating that the addenda records were successfully received, and the ACH transaction is ready to be processed.

Same-day ACH transactions are when the receiving depository financial institution (RDFI) posts the credit or debit to the payee account on the same day the transaction originated. Same-day ACH transactions cannot exceed a set maximum dollar amount per day. Typically, the total same-day ACH transactions cannot exceed $100,000 in a single business day.

This is an automatic setting for our clients. If you do not want the default option of same-day ACH transactions, you can choose to opt out. There is a surcharge for same-day transactions.

For the ACH Origination API, there are cutoff times for the ACH transaction to be posted the same day it originated:

SAME-DAY FLOWWindow 1Window 2Window 3
Client cutoff09:15 a.m. (EST)11:15 a.m. (EST)03:00 p.m. (EST)
File sent from KeyBank
to the ACH operator
09:30 a.m. (EST)11:30 a.m. (EST)03:45 p.m. (EST)
ACH transaction to RDFI12:00 p.m. (EST)04:00 p.m. (EST)05:30 p.m. (EST)
Posted to payee account01:30 p.m. (local)05:00 p.m. (local)RDFI end of day

Did you know?

With the ACH Origination API, you can inquire on the transactions before they are officially submitted for processing. The status endpoint tells you if the transaction was accepted (transaction request data is valid), rejected (there is missing or erroneous data in the request), or extracted (transaction received by the ACH core processing system).

Common terms

ACH operator

The central clearing facility managed by the Federal Reserve Bank.

ACH processor

The ACH core processing system takes the incoming transactions from the originating financial institution, which are then sorted, batched, and verified. After the transaction is legitimized, the funds are forwarded to the receiver’s financial institution.

Collected

The status when the originating transaction is received by the ACH processor.

Credit

To push funds to other accounts.

Debit

To pull funds from an account.

ODFI

Originating Depository Financial Institution is the financial institution of the originator. This ODFI has an active relationship with ACH services and sends transactions to the ACH network on behalf of the originator.

Originator

The company or business that initiates a transaction to the receiver (payee). Before a transaction can be sent, the originator has authorized the receiver to credit or debit their account.

PAR number

Payment Assigned Reference number is a unique identifier assigned by the ACH processor used to identify the transaction without exposing any sensitive consumer identification information. When you submit a request with the ACH Origination API, it creates a PAR number and returns the value in the response.

Posted

The status when a transaction is received by the ACH processor, reviewed by the ACH operator, and currently with core banking applications to secure and transfer funds. It could also indicate that the funds have been completely settled between originator and receiver.

RDFI

Receiving Depository Financial Institution is the financial institution of the receiver. The ACH operator processes the transactions and sends the funds to the financial institution before the money is posted to the receiver's account.

Receiver

The individual or company that receives the funds. Before a transaction can be received, the receiver has authorized the originator to credit or debit their account. The receiver may also be referred to as the payee.

Returned

The status when a transaction is reviewed by the ACH operator and the transaction is not cleared for transfer for reasons like insufficient funds or erroneous data.

Reversal

Request to cancel a payment after it has posted. Reversals are not guaranteed.

Trace number

The trace number is a unique identifier for an ACH transaction generated by the ACH Origination API. Use this number for your ACH Inquiry API requests.

Undo

Stop a transaction before it is received by the ACH processor. This window is typically 10 minutes in length.


With the ACH Inquiry API, you can check on the progress of a payment transaction after the ACH processor receives them.

See the specs

Use the account number, PAR number, or trace number from the ACH Origination transaction request to inquire about the status or get additional details of a transaction.

Account number

Use the KeyBank originator account number associated with ACH transaction to inquire about transactions that are posted. With the ACH List inquiry, all you need is an account number to look up ACH transactions.

PAR number

The PAR (Payment Assigned Reference) number is a unique identifier assigned by the ACH processor after you submit a request with the ACH Origination API. This is used to identify the transaction without exposing any sensitive consumer identification information.

In the ACH Inquiry API request, use the PAR number (parNumber) in the ACH Detail request to inquire about an account with this unique identifier.

Trace number

When you submit a request with the ACH Origination API, the ACH processor immediately creates a trace number unique to that transaction (traceNumber). Save this trace number if you intend to check on the progress of the ACH transaction or to use it for verification.

In the table below we associate each endpoint in the ACH Inquiry API, including legacy endpoints, with the key identifiers you can use to request the status of an ACH transaction.

ENDPOINTIDENTIFIER EXAMPLE 
ACH List/accounts/transactions/v1/ach/listaccountNumber: 222333448 
ACH Detail/accounts/transactions/v1/ach/detail/{parNumber}parNumber: 1234567891113 

A good reminder...

We recommend that you check on the status after 06:00 a.m. EST the following business day. By this time, the ACH processor has run the batch and consolidation processes.

 

The ACH List endpoint is a comprehensive search of all ACH transactions with a single account number. Use the date parameters or identify the ACH transaction status to better define the response. 

Request and response example

  • If you want to search with a date range, make sure to include the fromDate and toDate. You can search up to two years of past records. We recommend that you limit the date range to 31 days for a more efficient response.
  • If you are want to inquire about only a certain status of ACH transaction, use the dateSearchType parameter. You can filter the results by Collected, Returned, or Settled transactions.
Request
{
  "accountNumber": "3123456789",
  "dateSearchType": "COLLECTED",
  "fromDate": "2024-02-01T00:00:00.000Z",
  "toDate": "2024-02-01T00:00:00.000Z",  
  "minimumAmount": 100,
  "maximumAmount": 75020.5,
  "traceNumber": "041001030016002",
  "pageNumber": 1,
  "pageSize": 150  
}
Response
{
  "parNumber": "22018007665985",
  "transactionStatus": "COLLECTED",
  "traceNumber": "000000000000000",
  "transactionAmount": 10.01,
  "settlementDate": "2021-03-08",
  "transactionCode": "22",
  "transactionCodeDescription": "Automated Deposit",
  "transactionDescription": "DEPOSIT",
  "authorizedCustomerName": "TEST CUSTOMER1",
  "standardEntryClassCode": "CCD",
  "standardEntryClassDescription": "Cash Concentration or Disbursement",
  "receivingAccount": {
    "accountNumber": "123456789012",
    "bankNumber": "0000",
    "routingNumber": "1234567890"
    },
  "receivingParty": {
    "customerIdentificationNumber": "099999999",
    "companyName": "MERCHANT",
    "customerName": "TEST MERCHANT"
  },
  "originatingAccount": {
     "accountNumber": "123456789012",
    "bankNumber": "0000",
    "routingNumber": "1234567890"
   },
  "originatingParty": {
    "customerIdentificationNumber": "1234567",
    "companyName": "COMPANY NAME 1",
    "customerName": "CUSTOMER NAME 1"
  },
  "returnDate": "2024-02-01",
  "returnReasonCode": "R02",
  "returnReasonDescription": "Account Closed",
  "addendaCount": 1,
  "notificationOfChangeAddendaCount": 1,
  "internationalAddendaCount": 0,
  "customData": "merchant:status",
  "checkSerialNumber": "4345",
  "transactionDirection": "Receiving Item",
  "addenda": [{
    "sequenceNumber": 1,
    "entryDetailSequenceNumber": "188",
    "paymentRelatedInformation": "Addenda Record (Applies to CCD, CTX, PPD, and WEB entries)"
    }
  ],
  "notificationOfChange": [{  
  "changeCode": "C02",
  "changeDescription": "Incorrect transit/routing number",
  "correctedData": "1234567890"
   }
 ]
}

What to expect

  1. In the transactions response, you can expect to see the status, general transaction information, identification for the originating and receiving parties involved, return reason if applicable, and addenda counts. 
  2. A metadata object is part of the response that gives details about the inquiry results and size of response.

The ACH Detail endpoint retrieves details about an ACH transaction with a single PAR number.

Details returned include transaction IDs, originating parties, receiving parties, return reasons, transaction status, and Nacha SEC data.

Request and response example

Use the parNumber from the originating transaction to get additional details about the transaction. 

Request
curl --location: '{host}/v1/ach/detail/22018007665985'
--header 'Accept: application/json'
--header 'Authorization: Bearer testZcKJDWnwDWmmf9qah6PJvPy8'
Response
{
  "parNumber": "22018007665985",
  "transactionStatus": "COLLECTED",
  "traceNumber": "000000000000000",
  "transactionAmount": 10.01,
  "settlementDate": "2021-03-08",
  "transactionCode": "22",
  "transactionCodeDescription": "Automated Deposit",
  "transactionDescription": "DEPOSIT",
  "authorizedCustomerName": "TEST CUSTOMER1",
  "standardEntryClassCode": "CCD",
  "standardEntryClassDescription": "Cash Concentration or Disbursement",
  "receivingAccount": {
    "accountNumber": "123456789012",
    "bankNumber": "0000",
    "routingNumber": "1234567890"
    },
  "receivingParty": {
    "customerIdentificationNumber": "099999999",
    "companyName": "MERCHANT",
    "customerName": "TEST MERCHANT"
  },
  "originatingAccount": {
    "accountNumber": "123456789012",
    "bankNumber": "0000",
    "routingNumber": "1234567890"
    },
  "originatingParty": {
    "customerIdentificationNumber": "1234567",
    "companyName": "COMPANY NAME 1",
    "customerName": "CUSTOMER NAME 1"
   },
  "returnDate": "2024-02-01",
  "returnReasonCode": "R02",
  "returnReasonDescription": "Account Closed",
  "addendaCount": 1,
  "notificationOfChangeAddendaCount": 1,
  "internationalAddendaCount": 0,
  "customData": "merchant:status",
  "checkSerialNumber": "4345",
  "transactionDirection": "Receiving Item",
  "addenda": [{
    "sequenceNumber": 1,
    "entryDetailSequenceNumber": "188",
    "paymentRelatedInformation": "Addenda Record (Applies to CCD, CTX, PPD, and WEB entries)"
    }                                                        ],
  "notificationOfChange": [{
    "changeCode": "C02",
    "changeDescription": "Incorrect transit\/routing number",
    "correctedData": "1234567890"
    }
  ]
 }

What to expect

You receive a detailed response for the transaction associated with the provided PAR number. Details include information about the parties involved. the identification and account associated with the PAR number, and additional transaction information in addenda records. 

We all make mistakes. Sometimes we need to pull things back before we can move forward. KeyBank understands and our API Origination API has a few ways to do that.

You can undo a payment before it is collected by the ACH processor. Use the undo endpoint to stop the transaction before it is received by the ACH processor. The time window to undo is dependent upon the collection windows. The typical window to undo a payment is about 10 minutes but it can be more depending on when the payment is submitted and the collection schedule.

If the payment was collected and you still need to delete the payment, you can reverse the transaction within five banking days from the original effective date. When you reverse the transaction, it generates a reversal to the receiver’s account to pull back payments that were originated erroneously. While reversals are not a guaranteed success, it is an option to undo the original payment submitted after collection.

To reverse a payment, you have one of two options. You cannot do both of these options if one does not work.  

Option 1: Submit the file maintenance form for a payment reversal.

Option 2: Use ACH Direct to reverse a payment. You can search for the transaction by batch or account. Reversals are available within 5 banking days of the effective date for the current transactions. After you submit this request, the status for the transaction will be pending until it is fully processed as reversed.

Option 3: Complete an ACH Originate API request with the opposite credit or debit indicator in the creditDebitCode field of the request body. Update the companyEntryDescription in the request body to reflect REVERSAL.

A payment can be returned for various reasons like insufficient funds, unable to verify accounts, incorrect data in the request, or a security concern.

KeyBank recommends that you inquire about returns daily with the ACH Inquiry API. Here’s how:

  • To inquire about one or more transactions, use the account number and date fields to look up information.
  • To look up a specific returned transaction, use the PAR number. The PAR number is generated by the API and provided in the response. It is a unique identifier that matches the returned transaction to the original transaction.

Unauthorized returns apply mainly to disputed transactions where the person or company being charged does not consent to the funds transfer. There are different return time frames by SEC code so consider the exposure to unauthorized returns when you originate a payment with a certain SEC code.

 Consumer transactionsCommercial transactions
SEC codePPD, TEL, WEBCCD, CTX
Unauthorized returns windowup to 60 calendar days24 hours (two banking days)
 
 

Does ACH stand for Actual Common Help? It sure doesn’t, but we can answer some questions for you!

 

Where is my transaction? How can I get more information?

You submitted a request with the ACH Origination API to send or get money. Get the traceNumber or parNumber from the ACH Origination API response and use that identifier with the ACH Inquiry API request to track the status of the ACH transaction (or batch of transactions).

See our information on the ACH Inquiry API to learn more.

I got an error. What went wrong?

Everything went wrong. And you forgot to send that birthday card too!

OK, it’s not that serious. We can’t fix the birthday card situation, but we can help with that API error.

Check out more information in the Errors section of the API documentation for the ACH Origination API or the ACH Inquiry API.

What’s the difference between undo, reversal, and returned?

When you undo a transaction, you stop the ACH processor from receiving the request before the collection window.

For example, let’s say there is a 10-minute window to undo a payment before it is received by the ACH processor. You submit a transaction with the API at 08:15 a.m. EST. You have until 08:25 a.m. EST to undo this transaction before the ACH processor begins to process the transaction.

When you reverse a transaction, you missed the window to undo a request and now need to either submit the file maintenance form for a payment reversal, use ACH Direct, or attempt to reverse it with another transaction

When a transaction is returned, it means that something was not right when going through core banking applications for review and settlement. The transaction is returned to the originator without ever being posted.

CCD and PPD seem similar. What is the difference?

PPD transactions are typically from a corporate account to an individual account. Like if you are sending payroll to your employees, you are sending money from a corporate account to a personal account of the employee.

CCD transactions are usually from one commercial or business account to another. It could also be an individual account sending money to a vendor account. One example could be a renter (individual account) sending their rent check to the property management office (business account).

Is there a way to input a value in the request that I recall when using the ACH Inquiry API?

There are two fields available to attached additional information to a transaction.

  1. The entry description (companyEntryDescripiton) describes the purpose of the payment as defined by you. This is required for reporting and helps identify any differences between the transactions. This information is visible to the originator and the receiver.
  2. Use the custom data (customData) field to append specific information to a payment transaction. This information is only visible to the originator and can be recalled by the originator after a payment is collected.

    The custom data does not transmit with the payment as it is processed. The custom data is safely stored in KeyBank’s database. The traceNumber links the incoming collected or posted payment to the custom data, recalled from the request input.

What is the timing with payments?

ACH transactions are collected/distributed several times throughout the day. KeyBank’s final cutoff time for clients to send us an ACH file is 10:30 p.m. EST. The schedule is as follows:

ACH collection/distribution schedule

  1. Collection only, 05:00 a.m. EST
  2. Collection and distribution, 06:00 a.m. EST
  3. Collection and distribution, 09:30 a.m. EST
  4. Collection and distribution, 11:30 a.m. EST
  5. Collection and distribution, 01:30 p.m. EST
  6. Collection and distribution, 03:30 p.m. EST
  7. Collection and distribution, 07:00 p.m. EST
  8. Collection and distribution, 09:30 p.m. EST
  9. Collection and distribution, 10:30 p.m. EST

Can I do same-day payment?

For an additional fee, you can make same-day payments until approximately 03:00 p.m. EST. Funds are withdrawn the date the payment is processed and delivered by the following business day. The account’s available balance is updated when the payment is processed. The account ledger is updated the day after the payment is sent.

What about future date payments?

You can future date a transaction. The payment transaction is processed as normal and collected, but the payment does not post to the bank until the date specified.

Use effectiveDate in the request to specify when a collected transaction is posted. The effective date can be up to 30 days in the future. Typically, the funds will be distributed to the receiver 1-2 days prior to the effective date that was provided during origination. When setting the effective date, consider the schedule for collection windows and supporting processes.

Is there a limit to how many transactions I can send in a single request?

 

The ACH Origination API request is limited to 100 transactions per request for each of KeyBank’s clients. For each of the requests submitted, the clients will receive a message acknowledging either a successful transaction or a transaction error.

Is there a limit to how much money I can send in a same-day transaction?

 

Total same-day ACH payments cannot exceed $100,000 in a single business day.

Are there client requirements I should know about?

There are some required fields to initiate an ACH transaction. After you complete the KeyBank onboarding process, we will assign you values for point and collection application ID parameters that map to a legitimate bank account.

  • Point (point) is a short name specific to your company that’s assigned by KeyBank. The point name is nine characters long, but KeyBank limits the assigned name to eight characters. One character is used to match the input data of the request associated with this point value to the shared services payment system before batch processing. The point value is included in the file name and improves security for file transfers.
  • Collection application ID (collectionApplicationId) is a sub-level to the point value assigned by KeyBank. Every point requires at least one collection application identifier. The ID must not exceed 9 characters. If you have different settlement accounts, you'll need multiple collection application IDs, each connected to a specific settlement account.

There is another important parameter that is not required, but strongly encouraged. The universal unique identifier (uuid) is a custom value used to identify each transaction created by you. The UUID is required to undo a payment. The ID must not exceed 45 alphanumeric characters. The UUID is only part of the ACH Originate API and is not used to trace a transaction across its lifecycle, meaning it cannot be used as a lookup field in the ACH Inquiry API. The UUID is at the transaction level and provides the status of a specific transaction as Accepted, Waiting for Addenda, Consolidated, or Failed.

How do I send a prenote versus a live transaction?

A prenote (or as my grandfather calls it formerly - the prenotification entry) is a non-monetary entry submitted by an originator to a RDFI before sending a credit or debit entry to the receiver’s account with the RDFI.

A live transaction is a monetary entry submitted by an originator to a RDFI to send a credit or debit to the receiver’s account with the RDFI.

Word soup, right? Basically, a prenote is a notification the tells the RDFI to verify the account information. A live transaction is an actual payment.

In the request, define if the transaction is a prenote (P) or a live (L) transaction with the transactionType field.

 

What's next