Skip to main content

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)

Source distribution for achkit 0.2.0
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)

Table of built distributions (wheels) for achkit 0.2.0
File Interpreter ABI Platform Actions
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.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page