# US NACHA ACH File Generator, ABA Validator & Parser (`finops_studio/nacha-ach-file-generator`) Actor

Convert CSV, Excel rows, or JSON into bank-ready 94-character US NACHA ACH files (PPD Payroll, CCD Vendor, WEB) with 10-point ABA routing checksum validation, or parse raw ACH files to JSON.

- **URL**: https://apify.com/finops_studio/nacha-ach-file-generator.md
- **Developed by:** [FinOps Studio](https://apify.com/finops_studio) (community)
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 ach entry generated or parseds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## US NACHA ACH File Generator, ABA Routing Validator & Parser (`PPD`, `CCD`, `WEB`)

Generate strict **94-character fixed-width US NACHA ACH files** (`.ach`) for **Direct Deposit Payroll (`PPD`)**, **Corporate Vendor Payments (`CCD`)**, and **Online ACH Collections (`WEB`)** from CSV spreadsheets or JSON—or **parse raw NACHA files back into clean JSON**.

***

### Built-In US Bank Treasury Validations

- **10-Point ABA Routing Number Checksum:** Verifies every 9-digit US bank routing number (`(3*(d1+d4+d7) + 7*(d2+d5+d8) + (d3+d6+d9)) mod 10 === 0`) before generating the batch so a single-digit typo never causes a bank return fee.
- **Exact Entry Hash & Cent-Exact Control Totals:** Computes Record `8` (Batch Control) and Record `9` (File Control) 10-digit Entry Hashes and 12-digit cent-exact Credit (`22`/`32`) & Debit (`27`/`37`) sums.
- **Automatic Block-Factor-10 Padding:** Pads files to exact multiples of 10 lines with `9999...` filler records as required by J.P. Morgan Chase, Bank of America CashPro, Wells Fargo CEO, CitiDirect, PNC, and SVB.
- **Two-Way Mode (`generate` & `parse`):** Also decodes incoming 94-character NACHA files into clean JSON arrays for `n8n`, `Make.com`, `Zapier`, and **MCP AI Agents**.

***

### Companion Financial Automation Tools by FinOps Studio

- **[Interactive Web Hub & Free 3-Row Preview](https://geornaden.github.io/finops-studio/)** — Browser-local demo & `n8n` workflow templates
- [SEPA XML Generator (`pain.001` & `pain.008`)](https://apify.com/finops_studio/sepa-xml-generator) — European Bulk Payments & Direct Debits
- [EU E-Invoice XML Generator (`Peppol`, `XRechnung` & `Factur-X`)](https://apify.com/finops_studio/eu-einvoice-xml-generator) — Mandatory 2026 EN 16931 E-Invoices
- [Corporate `BAI2` Bank Statement Parser](https://apify.com/finops_studio/bai2-bank-statement-parser) — US Treasury Cash-Management Statements to JSON/CSV
- [German `DATEV Buchungsstapel` CSV Generator](https://apify.com/finops_studio/datev-buchungsstapel-generator) — DATEV EXTF v700 Export for Tax Advisors
- [Australian `ABA` Direct Entry File Generator](https://apify.com/finops_studio/aba-cemtex-file-generator) — BECS `.aba` Payroll & Supplier Batches
- [ISO 20022 `pain.002` Bank Status Decoder](https://apify.com/finops_studio/iso20022-pain002-status-parser) — Decode Bank Rejection Codes (`AC04`, `AM04`)

> **Disclaimer:** Technical 94-character NACHA formatting and ABA checksum utility provided "as-is", without financial or legal advice. Always verify routing numbers, account numbers, and control totals in your bank portal before transmitting ACH batches.

# Actor input Schema

## `mode` (type: `string`):

Choose 'generate' to build a 94-char NACHA ACH file from JSON/CSV, or 'parse' to convert a raw NACHA file into clean JSON.

## `secCode` (type: `string`):

PPD (Payroll / Consumer Direct Deposit), CCD (Corporate Vendor B2B), or WEB (Online Payment).

## `immediateDestination` (type: `string`):

9-digit ABA routing number of your US bank (e.g., 021000021 for Chase).

## `immediateDestinationName` (type: `string`):

Name of your US bank (up to 23 characters).

## `companyName` (type: `string`):

Your legal US company name (up to 16 chars in batch header).

## `companyId` (type: `string`):

9-digit EIN or 10-char ACH Company ID (e.g., 1123456789).

## `companyEntryDescription` (type: `string`):

Appears on recipient bank statements (e.g., PAYROLL, VENDOR PAY, RENT).

## `effectiveEntryDate` (type: `string`):

Target settlement date in YYYY-MM-DD format.

## `csvEntries` (type: `string`):

Optional CSV with columns: name,routing,account,amount,type,direction,id

## `entries` (type: `array`):

List of ACH entries with name, routingNumber, accountNumber, amount, accountType (checking/savings), transactionType (credit/debit).

## `rawNachaText` (type: `string`):

Paste an existing NACHA .ach / .txt file when mode is set to 'parse'.

## Actor input object example

```json
{
  "mode": "generate",
  "secCode": "PPD",
  "immediateDestination": "021000021",
  "immediateDestinationName": "JPMORGAN CHASE",
  "companyName": "ACME CORP US",
  "companyId": "1123456789",
  "companyEntryDescription": "PAYROLL"
}
```

# Actor output Schema

## `nachaAchFile` (type: `string`):

Direct link to download NACHA_ACH_BATCH.ach ready for US bank treasury upload.

## `summaryDataset` (type: `string`):

JSON summary with Entry Hash, block count, credit/debit USD totals, and parsed entries.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "immediateDestination": "021000021",
    "immediateDestinationName": "JPMORGAN CHASE",
    "companyName": "ACME CORP US",
    "companyId": "1123456789",
    "companyEntryDescription": "PAYROLL"
};

// Run the Actor and wait for it to finish
const run = await client.actor("finops_studio/nacha-ach-file-generator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "immediateDestination": "021000021",
    "immediateDestinationName": "JPMORGAN CHASE",
    "companyName": "ACME CORP US",
    "companyId": "1123456789",
    "companyEntryDescription": "PAYROLL",
}

# Run the Actor and wait for it to finish
run = client.actor("finops_studio/nacha-ach-file-generator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "immediateDestination": "021000021",
  "immediateDestinationName": "JPMORGAN CHASE",
  "companyName": "ACME CORP US",
  "companyId": "1123456789",
  "companyEntryDescription": "PAYROLL"
}' |
apify call finops_studio/nacha-ach-file-generator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,finops_studio/nacha-ach-file-generator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fB8dGnDcx3I3RMRYS/builds/27hKZ8g6Xa5ncKZma/openapi.json
