Generate, parse and validate NACHA ACH files in a few lines. Fully typed. Zero dependencies. Returns and NOC handled for you - in JavaScript and Python.
The whole story, no finance degree required.
To pay staff or charge customers, you send your bank an ACH file - an ancient, rigid text format where one wrong space or one stray penny makes the bank reject everyone's payment. achkit writes that file perfectly, so you just say "pay Jane $100" and it handles the rest.
NACHA makes the rules banks follow - like the DMV writes road laws but doesn't hand you a car. They publish a giant PDF rulebook and leave the code to you. Before achkit your only options were to build it from scratch or hand a payment giant a cut of every transaction, forever. achkit is the free third option.
The free library is a perfect offline spell-checker for the file - but it's blind to the real world. A typo'd routing number looks fine to it, and the payment bounces days later. Pro and Ultra check the Federal Reserve's live database to confirm the bank is real and open before money moves, and alert you when a payment bounces.
Every time you pay by credit card, Visa and Mastercard take a cut. That toll is unavoidable and expensive - so the old, slow, bank-to-bank ACH rails are the only other way to move money without paying a percentage tax on every dollar. The catch: ACH's rules are ancient and brutal. That's why developers reach for a free tool like achkit - to navigate them without ripping their hair out.
You refuse to hand Stripe a slice of every dollar, and you won't pay Modern Treasury thousands a month. You want to build the banking files yourself and keep 100% of your money - with a modern, free tool so your developers never fumble the math, and a cheap check that the bank accounts they type in are actually real.
| Option | How it moves money | What it costs you | The catch |
|---|---|---|---|
| Stripe / PayPal | Push a button, they pull the money | ~0.8% per payment (capped ~$5) | A cut of every transaction, forever |
| Modern Treasury / Dwolla | They build + send the files for you | Thousands / mo + per-transaction | Enterprise tollbooth pricing |
| Moov (moov-io/ach) | Free library you run yourself | Free | Go only - a separate server to use from Python/JS |
| Old OSS (node-nacha, pynacha…) | Free, aging libraries | Free | Unmaintained - breaks when NACHA changes rules |
| achkit | Free JS/Python lib builds the file; API checks the bank is real | Free lib + $29-99 / mo | You keep ~100% of your money |
Say you send 1,000 ACH payments of $200 a month. Stripe's ~0.8% fee is about $1,600/mo. The same file handed straight to your bank costs pennies each - roughly $30/mo. achkit is free for the library and $29-99 for live bank verification. You keep the difference.
Illustrative - your bank's per-file ACH rate and Stripe's pricing vary. The point stands: owning the file beats renting a percentage.
String padding, manual field offsets, and the NACHA spec open in another tab. Fragile and untested.
Full payment platforms hide ACH away - but you pay per transaction and hand them your whole money flow for a file-format problem.
A typed builder, a strict parser, and a validator that catches every reconciliation error before the file leaves your box.
The same typed model powers generation, parsing and validation across both languages. No config, no runtime deps.
import { AchFile } from 'achkit' const file = AchFile.create({ originDfi: '091000019', companyId: '1234567890' }) file.batch({ sec: 'PPD', description: 'PAYROLL', effectiveDate: '2026-07-22' }) .credit({ name: 'Jane Doe', routing: '011401533', account: '0072', amountCents: 124050 }) .debit({ name: 'ACME LLC', routing: '091000019', account: '1899', amountCents: 124050 }) const bytes = file.render() // balanced batch, hash totals + block padding done
Round-trip any NACHA file. Builder pads and balances; parser hands you typed records with no positional slicing.
Decode R-codes and C-codes, map returns to the original entry, and generate corrected re-submissions.
PPD, CCD, WEB, TEL, CTX and addenda - validated against the current NACHA rules.
Entry hash, batch and file control totals, and blocking factor computed for you - the errors an ODFI rejects on, caught first.
The library runs on your box, free forever - build, parse and validate ACH files locally. The paid API adds what a local library structurally cannot: live bank-routing verification against the FedACH directory, always-current NACHA rules, and return monitoring.