ACH¶
ACH is the primary method of transferring funds in the U.S., and it supports an immense range of payment scenarios. Most payment engines wrap that complexity behind a simpler interface, useful until you need a less-common flow. GIB takes the opposite approach: direct access to the network, with guidance where it helps and no abstraction that hides what's happening. Raw ACH file downloads are always available.
GIB acts as the Originating Depository Financial Institution (ODFI) when you submit; we receive as the RDFI when entries arrive at one of your accounts or virtual accounts.
How ACH works¶
ACH is an asynchronous network that sends files containing batches of transfers from the originating depository financial institutions (ODFI) to the Federal Reserve, and ultimately onward to the receiving depository financial institutions (RDFI). The network is unique in that it enables both push and pull transfers.
When you submit an ACH, those transfers go through multiple state transitions. One of the most powerful features of GIB is our ability to notify you during each transition. This keeps you updated throughout the process and allows you to track the outcome of each transfer.
Those new to payments or the U.S. market are often surprised to learn that ACH does not offer an explicit acknowledgement of success. ACH takes an exception-based approach: you find out the payment is successful by not receiving an error. Such "errors" are called Returns.
When to use it¶
- Push payments (you send money out): payroll, marketplace payouts, vendor payments, refunds.
- Pull payments (you debit an external account): account funding, recurring subscription billing, invoice collection.
- B2B with structured remittance: see CTX in the SEC code table below.
Don't use ACH for:
- Internal transfers between two GIB accounts, use BOOK instead.
- High-value transfers needing settlement finality, use Domestic Wire.
- Cross-border, use International Wire.
- Sub-real-time consumer push, ACH is not real-time even at same-day; use a wire if you need T+0 finality.
Bundling many end-customer payments¶
Fintechs that nest many small end-customer payments inside a single ACH credit (common for consumer remittance routed through a US-based liquidity provider or payment service provider, payroll bulk credits, and marketplace mass payouts) create a Subtransaction for each underlying customer payment, inbound or outbound. The bulk ACH is the only event on the rail; the Subtransactions are how the true senders and ultimate beneficiaries reach GIB's recordkeeping, monitoring, and OFAC screening. For International ACH (IAT), the same applies whenever the IAT batch represents many underlying consumer payments rather than one organization-to-organization transfer.
Operations¶
| Operation | Description | API reference |
|---|---|---|
| Create ACH transaction (subledger) | Create a single ACH Transaction directly (type: "ach") from your subledger system |
createTransaction |
| Parse ACH file | Validate a NACHA or JSON file without creating Transactions; use before submitting | publicTransactionParseACH |
| Create ACH transactions (file) | Submit a NACHA or JSON file to create Transactions synchronously | transactionCreateACH |
| Create ACH transactions (bulk) | Submit a large file asynchronously; returns immediately, processes in background | transactionCreateACHBulk |
| List transactions | Retrieve and filter ACH Transactions | getTransactions |
| Get transaction history | Retrieve audit history for a Transaction | getTransactionHistory |
| Get transaction files | Retrieve the raw NACHA file and parsed JSON for a Transaction, sent or received | getTransactionFiles |
| Originate a return | Return an inbound entry you choose not to accept | createTransactionReturn |
Transactions cannot be canceled individually; cancel the parent Batch via updateBatch (set state to canceled) while it is in created state.
ACH files must be balanced¶
Every batch you send must be balanced. Each payment entry moves money to or from someone else's account; the batch also carries an offset entry against your own account at GIB, for the net of those entries. The offset is how GIB knows which of your accounts funds or receives the batch: the API uses it as the origin account for every entry in the batch. An offset entry is an entry whose receiver name is OFFSET.
GIB rejects the whole file when you submit it if any batch breaks these rules:
- Use your own account. The offset's routing and account number must be an account at GIB configured on your user.
- One offset per batch. In the JSON format, add an
offsetobject to each batch and GIB generates the offset entry for you. See Create an ACH Transaction using JSON for an example. A batch that mixes debits and credits gets two offset entries from theoffsetobject, one per side. In a NACHA file, a batch may likewise carry at most one debit and one credit offset entry, both on the same account. - At least one payment entry. A batch made only of offset entries is rejected.
- Balanced amounts. The batch's debits, offset entries included, must equal its credits.
- Rebalance after any change. If you remove entries from a batch, for example after an OFAC rejection, adjust the offset to the remaining entries.
Requests to createTransaction are balanced for you.
Common stages in the lifecycle of an ACH transfer¶
For the canonical state machine, see Transactions.
Initiation¶
Each created ACH transfer request incorporates mandatory details: account number, routing number, amount, and Standard Entry Class (SEC) code. The request may optionally include parameters such as the recipient's name and identifying number, though most financial institutions do not enforce that the recipient name on the transfer match the account holder name.
Batching¶
ACH transactions are batched and do not settle instantly. We acknowledge that this may be a confusing concept in a 24/7 world. As such, when initiating an ACH transfer request, we, as the originating depository financial institution (ODFI), consolidate all ACH transfers into a smaller set of NACHA files for submission.
Submission and clearing¶
Banks submit these batch files to the Federal Reserve at specified times each day. These times align with specific submission windows and affect when funds are available at the receiving depository financial institutions (RDFI). If a file is successfully submitted, the Federal Reserve will respond with an acknowledgment, and GIB publishes and creates webhooks with the submission status of every ACH file.
ACH transfers can be submitted with different settlement timing (Same Day or Standard). For specific cutoffs and processing windows, see the central Timing & cutoffs.
Funds transfer and funds availability¶
The actual transfer of funds occurs during the settlement process, during which the Federal Reserve finalizes their calculations on the amounts to be debited and credited to the bank.
For an outbound ACH credit entry (ACH push from your account at GIB), funds will be deducted from the originator's bank account immediately upon initiation. If there are insufficient funds on the originator's bank account, the transfer request will fail.
For an outbound ACH debit transfer (ACH pull initiated from your account at GIB), funds will be made available upon receipt, subject to any holds placed by the Bank.
For specific timing and availability details, see the central Timing & cutoffs.
Receiving ACH: identifying the sender¶
When an ACH entry arrives at one of your accounts or virtual accounts, the sender is identified by the fields below. A domestic ACH entry carries the receiver's account number only; the NACHA format has no field for the sender's account number.
| NACHA field | Record | What it identifies | Where to find it |
|---|---|---|---|
| Company Name | Batch Header | The sender, as known to the receiver | origin_account_name |
| Company Identification | Batch Header | The sender's ID, assigned by the sender's bank | Parsed file (companyIdentification) |
| Company Entry Description | Batch Header | Purpose of the payment, set by the sender | reference, together with the entry's Identification Number |
| Originating DFI Identification | Batch Header | First 8 digits of the sender's bank routing number | Parsed file (ODFIIdentification) |
| Payment Related Information | Addenda 05 | Free-text remittance from the sender | payment_info |
| Trace Number | Entry Detail | Unique identifier of the entry | trace_reference |
Company Name is limited to 16 characters, so longer names arrive shortened. When a payment is sent through a payment processor or payroll provider, Company Name and Company Identification may identify that service rather than the payer.
Reconciling by sender. Company Identification paired with the Originating DFI routing number is the most stable way to recognize a repeat sender. Company Identification is assigned by the sender's bank, so it is unique only within that bank.
Identifying payers by account. To tell payers apart reliably, give each payer its own virtual account. The account that receives the payment then identifies who paid.
Getting the full entry. Every field received from the network is available with getTransactionFiles. In the dashboard, open the transaction under Transactions and select Show files. Both offer the raw NACHA file and a parsed JSON version. For full field definitions, see the NACHA ACH Developer Guide.
Returns¶
Returns occur when a payment instruction fails. There are a myriad of reasons why the payment might fail, and fortunately the reason is nearly always provided through the Return Code. You can see the list of Return Codes in the response section here.
Long-tail risk on consumer-authorization codes. Most ACH returns arrive within 2 banking days of the original entry. Codes related to consumer authorization (R05, R07, R10, R11, R37, R38, R51) can arrive up to 60 calendar days after the entry. The original entry will appear settled for weeks; the return can still hit months later. Build your customer-facing fund-availability promises, credit decisioning, and customer support flows accordingly.
Customers are right to be concerned about returns given that they may have already credited the beneficiary and recovery may be difficult to impossible. Note however that ACH push is generally the simpler approach as you are sending money from an account you control, meaning that, assuming you have funds, the most likely return reason relates to having incorrect account details for the beneficiary.
ACH pull is far more likely to result in failure and often occurs due to insufficient funds or invalid account details. Reducing the likelihood of returns is a complex topic. As such, if your funds flow relies upon ACH pulls, we suggest at minimum that you verify the counterparty using micro-deposits or a service like Plaid.
Please also review our Automated Returns documentation. For originating a return on an inbound entry yourself, see Returns.
Return codes¶
The following table covers the supported subset of ACH return codes for use with createTransactionReturn. Codes outside this list will be rejected.
| Code | Description | Detail | Time Frame |
|---|---|---|---|
R01 |
Insufficient Funds | The available and/or cash reserve balance is not sufficient to cover the dollar value of the debit Entry. | 2 Banking Days |
R02 |
Account Closed | A previously active account has been closed by the customer or RDFI. | 2 Banking Days |
R03 |
No Account / Unable to Locate Account | The account number structure is valid and it passes the check digit validation, but the account number does not correspond to the individual identified in the Entry, or the account number designated is not an existing account. | 2 Banking Days |
R04 |
Invalid Account Number Structure | The account number structure is not valid. | 2 Banking Days |
R05 |
Unauthorized Consumer Debit using Corporate SEC Code | CCD or CTX debit Entry was transmitted to a Consumer Account of the Receiver and was not authorized by the Receiver. | 60 Calendar Days |
R06 |
ODFI Requested Return | The ODFI has requested that the RDFI return an Erroneous Entry. | Any |
R07 |
Customer Revoked Authorization | The RDFI's customer (the Receiver) revoked the authorization previously provided to the Originator for this debit Entry. | 60 Calendar Days |
R08 |
Payment Stopped | The Receiver has placed a stop payment order on this debit Entry. | 2 Banking Days |
R09 |
Uncollected Funds | A sufficient ledger balance exists to satisfy the dollar value of the transaction, but the available balance is below the dollar value of the debit Entry. | 2 Banking Days |
R10 |
Originator not known and/or not authorized to Debit Receiver's Account | The RDFI has been notified by the Receiver that the Entry is unauthorized, improper, ineligible, or part of an incomplete transaction. For ARC and BOC entries, the RDFI has been notified by the Receiver that the signature on the source document is not authentic, valid, or authorized. For POP Entries, the RDFI has been notified by the Receiver that the signature on the written authorization is not authentic, valid, or authorized. | 60 Calendar Days |
R11 |
Customer advises not within Authorization Terms | The authorization to debit exists, but there is an error or defect in the payment such that the entry does not conform to the terms of the authorization. | 60 Calendar Days |
R12 |
Account Sold to Another DFI | A financial institution received an Entry to an account that was sold to another financial institution. | 2 Banking Days |
R14 |
Representative Payee Deceased | The representative payee is either deceased or unable to continue in that capacity. The beneficiary is not deceased. | 2 Banking Days |
R15 |
Beneficiary / Account Holder Deceased | (1) The beneficiary is deceased; or (2) the account holder is deceased. | 2 Banking Days |
R16 |
Account Frozen / Returned per OFAC | (1) Access to the account is restricted due to specific action taken by the RDFI or by legal action; or (2) OFAC has instructed the RDFI or Gateway to return the Entry. | 2 Banking Days |
R17 |
File Record Edit Criteria / Suspicious Entry with Invalid Account No. / Return of Improperly-Initiated Reversal | (1) Field(s) cannot be processed by RDFI; or (2) the Entry contains an invalid DFI Account Number (account closed/no account/unable to locate account/invalid account number) and is believed by the RDFI to have been initiated under questionable circumstances. | 2 Banking Days |
R20 |
Non-Transaction Account | ACH Entry to a non-Transaction Account. | 2 Banking Days |
R21 |
Invalid Company ID | The Identification Number used in the Company Identification Field is not valid. | 2 Banking Days |
R22 |
Invalid Individual ID | The Receiver has indicated to the RDFI that the number with which the Originator was identified is not correct. | 2 Banking Days |
R23 |
Receiver Refused Credit | Any credit Entry that is refused by the Receiver may be returned by the RDFI. | Any |
R24 |
Duplicate Entry | The RDFI has received what appears to be a duplicate Entry; i.e., the trace number, date, dollar amount and/or other data matches another transaction. | 2 Banking Days |
R29 |
Not Authorized by Corporate Customer | The RDFI has been notified by the Receiver (Non-Consumer) that a specific Entry has not been authorized by the Receiver. | 2 Banking Days |
R31 |
Permissible Return (CCD and CTX only) | The RDFI may return a CCD or CTX Entry that the ODFI agrees to accept. | Any |
R33 |
Return of XCK | This Return Reason Code may only be used to return XCK Entries and is at the RDFI's sole discretion. | 60 Calendar Days |
R37 |
Source Document Presented | The source document to which an ARC, BOC, or POP Entry relates has been presented for payment. | 60 Calendar Days |
R38 |
Stop Payment on Source Document | The RDFI determines a stop payment order has been placed on the source document to which the ARC or BOC Entry relates. | 60 Calendar Days |
R39 |
Improper Source Document | The RDFI determines that: (1) the source document used for an ARC, BOC, or POP Entry to its Receiver's account is improper, or (2) an ARC, BOC, or POP Entry and the source document to which the Entry relates have both been presented for payment and posted to the Receiver's account. | 2 Banking Days |
R51 |
Ineligible / Improper Item Related to RCK | An RCK Entry is considered to be ineligible or improper. | 60 Calendar Days |
R52 |
Stop Payment on Item Related to RCK | A stop payment order has been placed on the item to which the RCK Entry relates. | 60 Calendar Days |
R53 |
Item and RCK Presented for Payment | In addition to an RCK Entry, the item to which the RCK Entry relates has also been presented for payment. | 60 Calendar Days |
Notifications of Change (NOC)¶
A Notification of Change is a non-monetary message sent by the receiving bank (RDFI) to notify GIB, as the originating bank (ODFI), that information used in a prior ACH entry is incorrect or outdated and should be corrected for future entries. Common corrections: routing number, account number, account type (checking vs. savings), individual name, individual identification number. NOCs frequently result from bank mergers or acquisitions that change routing or account numbers, but they also arise from routine data corrections by the RDFI.
NOCs are not optional to act on. Under the NACHA Operating Rules, your organization must update its records so that future ACH entries to the same receiver use the corrected information within six banking days of receipt of the NOC, or before initiating another entry to that receiver, whichever is later. Non-compliance can result in penalties under the NACHA Operating Rules, and continued non-compliance can lead to the RDFI refusing future entries to the affected receiver.
An NOC itself is informational, not a Return. The original entry was or will be processed normally; the NOC just tells you what to correct going forward.
You'll receive each NOC via webhook when it's posted to the API. Individual users can also opt in to in-app and email notifications via the GIB platform. The corrected information from the RDFI is included in the NOC payload.
Operational notes¶
A few GIB-specific behaviors to be aware of when integrating against ACH:
- ACH origination confirmation. GIB confirms ACH origination via webhook.
- OFAC handling on outbound batches. For OFAC hits, the entire ACH batch is rejected and the customer is notified. The customer must then remove the OFAC-hit transactions and rebalance the ACH file.
- Addenda passthrough. Generally, neither GIB nor our correspondent bank changes addenda content in ACH files. Confirm passthrough of any required data during the penny-test phase to ensure your customer's needs are met.
- Inbound files. Files are pushed to GIB throughout the day, and ACH returns received from RDFIs arrive in them. See Receiving ACH for the sender fields and for downloading the raw and parsed files.
Timing & cutoffs¶
GIB's ACH submission cutoffs, Federal Reserve processing windows, business-day rules, and inbound/return file timing are documented centrally on the Timing & cutoffs page.
SEC codes¶
A Standard Entry Class (SEC) code is a three-character code used to identify various properties of ACH transfers. GIB supports all SEC codes for inbound ACH transfers. However, for outbound ACH transfers initiated via our ACH transfer API, only certain SEC codes are supported by GIB. Be sure to include an entry_class_code when creating an ACH transfer.
| SEC | Description | Outbound | Inbound |
|---|---|---|---|
| ACK | Payment Acknowledgment: Non-Monetary Entry initiated by an RDFI to provide an acknowledgment of receipt of a CCD request. | No | Yes |
| ARC | Accounts Receivable: Single Entry debit initiated by an Originator to the Receiver's account based on an Eligible Source Document provided to the Originator by the Receiver (1) via the U.S. mail or delivery service, (2) at a dropbox location, or (3) in person for payment of a bill at a manned location. | No | Yes |
| ATX | Financial EDI Acknowledgement: Non-Monetary Entry initiated by an RDFI to provide an acknowledgment of receipt of a CTX request. | No | Yes |
| BOC | Back Office Conversion: Single Entry debit initiated by an Originator to the Receiver's account based on an Eligible Source Document provided to the Originator by the Receiver at the point of purchase or at a manned bill payment location for subsequent conversion during back office processing. | No | Yes |
| CCD | Corporate Credit or Debit: Entry initiated by an Organization to transfer funds to or from an account of that Organization or another Organization. | Yes | Yes |
| CIE | Customer Initiated Entry: Credit Entry initiated by or on behalf of the holder of a Consumer Account to transfer funds to the account of the Receiver. | Yes | Yes |
| CTX | Corporate Trade Exchange: Entry initiated by an Organization to transfer funds to or from the account of that Organization or another Organization that permits the inclusion of payment-related remittance information in ANSI or UN/EDIFACT syntax. | Yes | Yes |
| IAT | International ACH Transaction: Entry that is part of a payment transaction involving a Financial Agency's office that is not located in the territorial jurisdiction of the United States. An office of a Financial Agency is involved in the payment transaction if it (1) holds an account that is credited or debited as part of the payment transaction, (2) receives payment directly from a Person or makes payment directly to a Person as part of the payment transaction, or (3) serves as an intermediary in the settlement of any part of the payment transaction. | Yes | Yes |
| MTE | Machine Transfer Entry: Entries initiated at an "Electronic terminal," as defined in Regulation E, to transfer funds to or from a Consumer Account maintained with an RDFI, i.e., an ATM cash deposit or withdrawal. | No | Yes |
| POP | Point-of-Purchase Entry: Single Entry debit initiated by an Originator to the Receiver's account based on an Eligible Source Document provided to the Originator by the Receiver at the point of purchase or manned bill payment location to transfer funds from the Receiver's account. | No | Yes |
| POS | Point-of-Sale Entry: Debit Entry initiated at an "Electronic terminal," as defined in Regulation E, to transfer funds from a Consumer Account of the Receiver to pay an obligation incurred in a point-of-sale transaction, or to effect a point-of-sale terminal cash withdrawal. Also an adjusting or other credit Entry related to such debit Entry, transfer of funds, or obligation. | No | Yes |
| PPD | Prearranged Payment and Deposit: Entry initiated by an Organization based on a standing or a Single Entry authorization from a Receiver to transfer funds to or from a Consumer Account of the Receiver. | Yes | Yes |
| RCK | Re-presented Check: Single Entry debit constituting a presentment notice of an item eligible. | No | Yes |
| SHR | Shared Network Transaction: Debit Entry initiated at an "Electronic terminal," as defined in Regulation E, to transfer funds from a Consumer Account of the Receiver to pay an obligation incurred in a point-of-sale transaction, or to effect a point-of-sale terminal cash withdrawal. Also an adjusting or other credit Entry related to such debit Entry, transfer of funds, or obligation. SHR Entries are initiated in a shared network where the ODFI and RDFI have an agreement in addition to these Rules to process such Entries. | No | Yes |
| TEL | Telephone-Initiated Entry: Debit initiated by an Originator pursuant to an oral authorization obtained over the telephone to transfer funds from a Consumer Account of the Receiver. | Yes | Yes |
| TRC | Check Truncation Entry: Debit Entry initiated pursuant to a Check Truncation Program that permits the Truncation of a single Check drawn on the paying bank. | No | Yes |
| TRX | Check Truncation Entries Exchange: Debit Entry initiated based on a Check Truncation Program that permits the Truncation of multiple Checks drawn on the same paying bank. | No | Yes |
| WEB | Internet-Initiated/Mobile Entry: (1) a debit Entry initiated by an Originator to a Consumer Account of the Receiver based on (a) an authorization that is communicated, other than by an oral communication, from the Receiver to the Originator via the Internet or a Wireless Network, or (b) any form of authorization if the Receiver's instruction for the initiation of the individual debit Entry is designed by the Originator to be communicated, other than by an oral communication, to the Originator via a Wireless Network; or (2) a credit Entry initiated by or on behalf of the holder of a Consumer Account that is intended for the Consumer Account of a Receiver, regardless of whether the authorization of such Entry is communicated via the Internet or Wireless Network. | Yes | Yes |
| XCK | Destroyed Check Entry: Debit Entry initiated with respect to an item eligible. | No | Yes |
NACHA return-rate thresholds¶
NACHA enforces aggregate return-rate thresholds at the program level:
- Administrative (R02, R03, R04, etc.): 3.0%
- Unauthorized (R05, R07, R10, R11, R29, R37, R38, R51): 0.5%
- Total: 15%
Approaching any threshold is an operational issue; GIB monitors program-wide rates and will alert you well before NACHA does. See Reconciliation for daily monitoring practices.
Submission paths: file vs. JSON¶
You can submit ACH in two formats:
- NACHA file: a binary file conforming to the NACHA spec (PPD, CCD, CTX, etc.). Best for batch use cases or when migrating from an existing in-house ACH stack. See Batches & Files.
- JSON: a structured request body. Best for one-off submissions, API-first integrations, and when you don't already have a NACHA file generator.
Both paths produce identical results downstream; pick whichever fits your stack.
Related concepts¶
- Transactions, data model and full state machine
- Batches & Files, submission workflows
- Automated Returns, when GIB returns inbound entries on your behalf
- Returns, originating returns
- Reconciliation, daily reconciliation when using virtual accounts
- Webhooks,
transaction.ach.*event delivery - Idempotency, safe retries on
POST - Errors, error response shape and code catalog