---
updatedAt: 2026-03-16T15:57:39.000Z
agentTools:
  projectIndex: https://docs.gospidr.com/llms.txt
---

# ACH Accounts and ACH Transactions

This page describes the process for adding ACH accounts and creating ACH originations

# ACH Overview

ACH transactions can be originated via the [Create ACH Transfer](https://docs.gospidr.com/reference/postv1transactioncreateachtransfer) endpoint. Please note that all ACH transactions created are **originations**, meaning that the ACH file is generated by your partner bank and sent to an external bank for processing. ACH transactions fall into one of two categories:

* **ACH Push Origination**
  * Generates a request to 'push' funds to an external account.
  * Your customer's account will be debited and the external account will be credited.
  * Indicated by `'C'` for `debitCreditIndicator` in the `/createAchTransfer` call.
* **ACH Pull Origination**
  * Generates a request to 'pull' funds from an external account into your customer's account.
  * Your customer's account will be credited and the external account will be debited.
  * Indicated by `'D'` for `debitCreditIndicator` in the `/createAchTransfer` call.
  * Your partner bank will typically require a set number of 'hold days' before ACH pull originations post to your customer's account to reduce returns and mitigate fraud.

# Creating ACH Accounts

Before an ACH transaction can be initiated, you must create an ACH account to associate with the given customer (see [Create ACH Account](https://docs.gospidr.com/reference/postv1achaccountcreate)).

After creating the ACH account, you will receive an `achAccountId` which will serve as the unique identifier for the external account. Use this ID when calling the [Create ACH Transfer](https://docs.gospidr.com/reference/postv1transactioncreateachtransfer) endpoint.

There are two ways to create an ACH account:

| Method                 | When to use                                       | Key field                         |
| ---------------------- | ------------------------------------------------- | --------------------------------- |
| **Raw account data**   | You provide the routing + account number directly | `routingNumber` + `accountNumber` |
| **Linked Institution** | User links via Plaid                              | `linkedInstitutionAccountId`      |

> 📘 Please note
>
> Your partner bank will likely limit the number of ACH account connections per customer account to limit fraud. ACH accounts can be removed via [Remove ACH Account](https://docs.gospidr.com/reference/deletev1achaccountid).

# Using Linked Institutions for ACH

Spidr's [Linked Institutions](https://docs.gospidr.com/docs/linked-institutions-setup-guide) feature allows users to connect their external bank accounts via Plaid. Benefits for ACH:

* Eliminates manual routing/account number entry (and the errors that come with it)
* Validates account ownership via the provider
* Enables balance checks before ACH pull originations (via `checkBalance` parameter)
* Does not require your system to handle or store raw account numbers

## Linked Institution → ACH Account

After a user completes the Linked Institutions flow (see the [setup guide](https://docs.gospidr.com/docs/linked-institutions-setup-guide) for full integration steps), you receive a `linkedInstitutionAccountId` for each connected account. Pass this ID — in place of routing/account numbers — when calling [Create ACH Account](https://docs.gospidr.com/reference/postv1achaccountcreate):

```
POST /v1/achaccount/create
{
  "accountId": "<spidr_account_id>",
  "linkedInstitutionAccountId": "<linked_institution_account_id>"
}
```

Spidr resolves the account details from the linked institution record; no routing or account number is needed in the request. The returned `achAccountId` is then used for all subsequent [Create ACH Transfer](https://docs.gospidr.com/reference/postv1transactioncreateachtransfer) calls.

> 📘 Balance checks
>
> When calling [Create ACH Transfer](https://docs.gospidr.com/reference/postv1transactioncreateachtransfer), pass `checkBalance: true` to verify sufficient funds in the linked external account before the transfer is created. You can also pass `minimumRemainingBalance` to enforce a floor on the external account's post-transaction balance. Balance check availability for linked institution accounts is contingent on your product's configuration.