achkit
The ACH file toolkit for developers. Generate, parse and validate NACHA ACH files in a few lines. Fully typed. Zero dependencies. Returns and NOC included. Available for both JavaScript/TypeScript and Python, with byte-identical output across the two.
npm i achkit pip install achkit
The NACHA format is 94-character fixed-width records, positional fields, blocking factors of ten, and hash totals that must reconcile to the byte. One off-by-one and your ODFI rejects the whole batch. achkit does the counting so you describe intent instead.
JavaScript / TypeScript
import { AchFile, parse, validate } 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
const { ok, errors } = validate(bytes)
const parsed = parse(bytes) // every field typed, no positional slicing
Python
from achkit import AchFile, parse, validate
f = AchFile.create(origin_dfi="091000019", company_id="1234567890")
b = f.batch(sec="PPD", description="PAYROLL", effective_date="2026-07-22")
b.credit(name="Jane Doe", routing="011401533", account="0072", amount_cents=124050)
b.debit(name="ACME LLC", routing="091000019", account="1899", amount_cents=124050)
data = f.render()
result = validate(data)
parsed = parse(data)
What's inside
- Generate & parse any NACHA file, round-trip safe.
- Reconciliation validator - ABA routing checksum, entry hash, batch and file control totals, blocking factor. Catches what an ODFI rejects on, before the file leaves your machine. Runs on any file, not just ones achkit made.
- Returns & NOC - R-code and C-code lookup for return processing.
- SEC codes - PPD, CCD, WEB, TEL, CTX and single 05 addenda.
- Money is always integer cents. Dates are always
YYYY-MM-DD. No floats, no locale surprises.
Hosted API client (paid)
The library is free and local. The hosted API adds what a local library can't - live routing verification against the FedACH participant directory. Get an API key at achkit.com/dashboard.
import { AchkitClient } from 'achkit'
const client = new AchkitClient({ apiKey: 'ak_...' })
const bank = await client.verifyRouting('021000021')
// { routing, checksumValid, found, active, bank: { name, city, state } }
const result = await client.validate(bytes) // reconciliation + live routing checks
from achkit import AchkitClient
client = AchkitClient("ak_...")
bank = client.verify_routing("021000021")
result = client.validate(data)
Pro adds live routing verification + 10,000 validations/month; Ultra is unlimited with return-file monitoring. See achkit.com.
License
MIT
Metadata
Release files for achkit 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| achkit-0.2.0.tar.gz | 9.2 kB | Without provenance | Details for achkit-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| achkit-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for achkit-0.2.0-py3-none-any.whl |
Total release size: 20.1 kB
Release files / achkit-0.2.0.tar.gz
| Download URL | achkit-0.2.0.tar.gz |
|---|---|
| Size | 9.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
711d630c0874b0fbf47ee0b0f5ab5f807fc62d58578762f686d04da496f54967
|
|
BLAKE2b-256 checksum How to use checksums |
e00b6e24611ded681cc0a9da692ad8100322bf22501a597ddc9872ea2ecfa9e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Release files / achkit-0.2.0-py3-none-any.whl
| Download URL | achkit-0.2.0-py3-none-any.whl |
|---|---|
| Size | 10.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7b458c821bfe10b076e9093dbb43ab85544735633c69a3d2eb919e30317e090b
|
|
BLAKE2b-256 checksum How to use checksums |
b3ede33ade76bef2e0f6c832b631c703b1f3dba61ed1ed0f481504f3330cfd16
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Security for achkit 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.