Create payments that directly involve external bank accounts using the Automated Clearing House (ACH) network.

## Payment methods

Before initiating a transfer, you will need to set appropriate payment method types for debits (money in) and credits (money out).

### Money in

Moov pulls funds into the Moov platform using ACH debits. ACH debits can be created using a payment method with one of the following types:

- `ach-debit-fund`: Represents a "funding" flow (for example, topping up your own Moov wallet for a disbursement)
- `ach-debit-collect`: Represents the first stage of a "pull" flow (for example, collections or billing)

A bank account must be verified using [instant micro-deposit](https://docs.moov.io/guides/sources/bank-accounts/verification/instant-micro-deposit/) verification, or one of Moov's verification partners before it can be debited.

### Money out

Funds leave the Moov platform with ACH credits. You can specify the processing speed using a payment method with one of the following types:

- `ach-credit-same-day`: Payment is processed with "same-day" ACH processing
- `ach-credit-standard`: Payment is processed with standard "next-day" ACH processing

Moov processes in all same-day windows listed below:

| Processing speed | Cutoff time | Expected time posted to bank |
| --- | --- | --- |
| Same-day window 1 | 10:00 AM ET | Early afternoon |
| Same-day window 2 | 2:15 PM ET | End of day |
| Same-day window 3 | 4:15 PM ET | End of day |
| Standard | 5:30 PM ET | Next day |

A source account will see `Moov` on their statement, and a destination account will see the source's `displayName` on their bank statement. You can customize the name and description an account sees by using the `achDetails` fields. See the [customized ACH statement descriptors](https://docs.moov.io/guides/money-movement/accept-payments/ach/ach-overview/#customized-ach-statement-descriptors) section for more information.

## ACH processing and holds

Moov offers both [standard ACH processing](https://docs.moov.io/guides/money-movement/accept-payments/ach/ach-processing-speeds/#standard-same-day-processing) and [faster ACH processing](https://docs.moov.io/guides/money-movement/accept-payments/ach/ach-processing-speeds/#faster-same-day-processing). Three main factors determine the processing speed of a transfer:

- The type of transfer (for example, bank-to-bank)
- ACH payment method type (for example, `ach-credit-same-day`)
- Cutoff times

For standard bank-to-bank transfers, Moov holds funds that enter the platform via an ACH debit for two to three banking days before making the funds available, even when using "same-day" processing. The purpose of the hold is to account for the lag in time it takes to hear back about returns or processing issues.

For faster bank-to-bank transfers, Moov removes the hold on ACH debits. The ACH credit process starts within hours of the transfer being initiated, allowing for transfers to fully complete within one day as long as the transfer is initiated before certain [cutoff times](https://docs.moov.io/guides/money-movement/accept-payments/ach/ach-processing-speeds/#faster-same-day-processing). **Accounts must be approved by Moov to use faster ACH processing.**

ACH payments are processed in batches and must be uploaded to Moov's partner financial institutions before certain cutoff times. See the [processing speed](https://docs.moov.io/guides/money-movement/accept-payments/ach/ach-processing-speeds/) document for more information on processing speed, cutoff timetables, and examples of transfer timelines.

For information on how to see transfer details and status information, see the [ACH details](https://docs.moov.io/guides/money-movement/accept-payments/ach/ach-details/) document.

## Transfer limits

The list below describes Moov's platform limits. Accounts may have lower limits than what is listed below due to the verification/underwriting process. Moov must qualify each customer for any exceptions to limits. If you have a question with regards to your account’s specific limits, please [contact Moov](https://support.moov.io/).

| Payment method | Moov limit |
| --- | --- |
| `ach-debit-fund` (same day) | $1,000,000 |
| `ach-debit-fund` (standard) | $99,999,999.99 |
| `ach-debit-collect` (same day) | $1,000,000 |
| `ach-debit-collect` (standard) | $99,999,999.99 |
| `ach-credit-same-day` | $500,000 |
| `ach-credit-standard` | $99,999,999.99 |

## Customized ACH statement descriptors

You have the option to override the default Nacha file entries that appear on bank statements. To do this, set custom ACH statement descriptors when [creating a transfer](https://docs.moov.io/api/money-movement/transfers/create/). Use the following fields on the source, destination, or both, to provide more clarity or context for an individual transfer:

- `achDetails.companyEntryDescription`: Describe the purpose of the transaction
- `achDetails.originatingCompanyName`: Set the name how you'd like it to appear on the statement

Customizing these fields on the **source** will update the information on the bank statement where the debit occurs. Customizing these fields on the **destination** will update the information on the bank statement where the credit occurs.

For example, in a transfer where the source and destination are the same Moov account, your account's ACH company name would be used as the default originating company name unless a customization was set. The example below sets custom descriptors for both the source and destination.

Ask

```zsh
curl -X POST "https://api.moov.io/accounts/{accountID}/transfers" \
  -H "Authorization: Bearer {token}" \
  -H "X-Idempotency-Key: UUID" \
  -H "X-Wait-For: rail-response" \
  -H "x-moov-version: v2024.01.00" \
  --data-raw '{
    "amount": {
      "value": 100,
      "currency": "USD"
    },
    "destination": {
      "paymentMethodID": "string",
      "achDetails": {
        "companyEntryDescription" : "Gym dues",
        "originatingCompanyName" : "Whole Body Fit"
      }
    },
    "source": {
      "paymentMethodID": "string",
      "achDetails": {
        "companyEntryDescription" : "Gym dues",
        "originatingCompanyName" : "Whole Body Fit"
      }
    }
  }'\
```

Ask

```go
mc, _ := moov.NewClient()

var accountID string

mc.CreateTransfer(ctx, accountID, moov.CreateTransfer{
  Amount: moov.Amount{
    Currency: "USD",
    Value:    100, // $1.00
  },
  Destination: moov.CreateTransfer_Destination{
    PaymentMethodID: "string",
    AchDetails: &moov.CreateTransfer_AchDetailsBase{
      CompanyEntryDescription : "Gym dues",
      OriginatingCompanyName : "Whole Body Fit",
    },
  },
  Source: moov.CreateTransfer_Source{
    PaymentMethodID: "string",
    AchDetails: &moov.CreateTransfer_AchDetailsSource{
      CompanyEntryDescription : "Gym dues",
      OriginatingCompanyName : "Whole Body Fit",
    },
  },
})
```

## SEC codes

You have the option of specifying an SEC code in certain ACH transfer request scenarios. If none is provided, Moov will handle the SEC code on your behalf (`CCD` for business accounts and `PPD` for individual accounts).

| SEC code | Authorization type | Description | Supports addenda |
| --- | --- | --- | --- |
| `CCD` | Corporate credit or debit | An ACH debit _between two business accounts_, such as vendor payments or funding payroll. | Yes |
| `PPD` | Prearranged payment and deposit | An ACH transaction involving _an individual account_ to make or collect a payment. | Yes |
| `WEB` | Internet initiated/mobile entries | Moov allows `WEB` transactions for debit entries _from an individual to a business account._ Authorization is obtained via the internet or a wireless network (not including oral authorization over a telephone). | Yes |
| `TEL` | Telephone initiated entries | An ACH debit _from an individual to a business account_ with authorization obtained orally through a telephone, and recorded. See Nacha's [guidance](https://www.nacha.org/rules/meaningful-modernization) for use-cases and authorization requirements. | No |

### Individual to business transactions

You have the option of specifying an SEC code on an ACH transaction that has an individual account as the source and a business account as the destination. The following SEC codes can be provided in **source.achDetails** when making a transfer `POST` [request](https://docs.moov.io/api/money-movement/transfers/create/): `WEB`, `TEL`, `PPD`. If no SEC code is provided, the SEC code will be set as `WEB`.

### Other transaction scenarios

If the source and destination of an ACH transaction are both business accounts, the SEC code will be set as `CCD`. If the source is a business account and the destination is an individual account, the SEC code will be set as `PPD`.

## ACH addenda

When you create a transfer, you can add supplemental payment information with an addenda record. Set an addenda in the `source.achDetails` and `destination.achDetails` object. Moov supports standard ACH and properly formatted TXP addenda.

Use cases for ACH addenda include:

- Tax payments (TXP addenda) required by the IRS and many state agencies
- B2B payments that include remittance or invoice references
- Specialized payments in healthcare, payroll, or government

The example below shows a transfer with a TXP addenda record. Addenda must use valid Nacha characters and be less than 80 characters in length.

Ask

```zsh
curl -X POST POST "https://api.moov.io/accounts/{accountID}/transfers" \
  -H "Authorization: Bearer {token}" \
  -H "X-Idempotency-Key: UUID" \
  -H "X-Wait-For: rail-response" \
  -H "x-moov-version: v2024.01.00" \
  -d '{
    "amount": {
      "value": 10000,
      "currency": "USD"
    },
    "source": {
      "paymentMethodID": "afaa9b4a-4fd7-4678-9fb7-d62e550fa13c",
      "achDetails": {
        "secCode": "CCD",
        "companyEntryDescription": "Tax payment",
        "originatingCompanyName": "The Body Shop Yoga",
        "addenda": [\
          {\
            "record": "TXP*123456789*94105*960301*1*10000*2*5000*3*15000"\
          }\
        ]
      }
    },
    "destination": {
      "paymentMethodID": "346039ed-2282-4936-bc30-1c3c396876aa",
      "achDetails": {
        "addenda": [\
          {\
            "record": "Invoice #INV-2025"\
          }\
        ]
      }
    },
    "description": "Federal tax payment"
  }'
```

### Data masking

ACH addenda, especially TXP records, may contain sensitive information such as SSNs or tax identifiers. For privacy and security reasons, Moov masks personally identifiable information and returns a safe addenda string in the response. If an addenda record has been masked, `isMasked` will be **true**, as shown below.

Ask

```json
{
  "achDetails": {
    "addenda": [\
      {\
        "isMasked": true,\
        "record": "TXP*XXXXX6789*94105*960301*1*10000*2*5000*3*15000"\
      }\
    ]
  }
}
```

Moov does not validate the semantic correctness of TXP fields — only format, length, and eligibility. An addenda record added to a `TEL` SEC code is not allowed by Nacha and will be rejected.
