Python & Node.js Recipes for Bank-Grade SEPA XML, NACHA `.ach`, BAI2, Peppol & DATEV
Stop maintaining brittle fixed-width column offsets, floating-point `CtrlSum` bugs, and annual ISO 20022 / EPC schema migrations inside your app codebase. Drop these 35-line standard-library scripts into your backend, Airflow DAG, or cron job for $0/month + $0.02/row.
1. Node.js 20+ — Generate 2026 ISO 20022 SEPA XML (`pain.001.001.09`)
Download .mjsValidates every European IBAN via MOD-97, enforces 2026 EPC structured addresses (eliminating `BE04` bank rejections), and outputs ready-to-upload XML:
const res = await fetch(
`https://api.apify.com/v2/acts/finops_studio~sepa-xml-generator/run-sync-get-dataset-items?token=${process.env.APIFY_TOKEN}`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
messageType: 'pain.001.001.09',
initiatingPartyName: 'Acme Europe GmbH',
debtorName: 'Acme Europe GmbH',
debtorIban: 'DE89370400440532013000',
debtorBic: 'COBADEFFXXX',
debtorAddress: { townName: 'Berlin', postCode: '10117', country: 'DE' },
executionDate: '2026-11-16',
transactions: [
{
endToEndId: 'INV-2026-4410',
creditorName: 'Nordic Cloud AB',
creditorIban: 'NL91ABNA0417164300',
amount: 2450.75,
currency: 'EUR',
remittanceInfo: 'Invoice 4410 Cloud Hosting',
creditorAddress: { townName: 'Amsterdam', postCode: '1012', country: 'NL' }
}
]
})
}
);
const [{ xmlContent }] = await res.json();
2. Python 3 — Generate 94-Character US NACHA Direct Deposit (`.ach`)
Download .pyVerifies 9-digit Federal Reserve ABA routing checksums (`3-7-1` MOD-10), computes entry hashes, and pads final output to strict `9999...` block-of-10 lines for Chase, BofA, Wells Fargo, Citi, and Silicon Valley Bank:
import json, os, urllib.request
url = f"https://api.apify.com/v2/acts/finops_studio~nacha-ach-file-generator/run-sync-get-dataset-items?token={os.environ['APIFY_TOKEN']}"
payload = {
"immediateDestination": "021000021",
"immediateDestinationName": "JPMORGAN CHASE",
"immediateOrigin": "1999999999",
"immediateOriginName": "ACME CORP INC",
"companyName": "ACME CORP",
"companyIdentification": "1999999999",
"standardEntryClassCode": "PPD",
"companyEntryDescription": "PAYROLL",
"effectiveEntryDate": "261116",
"originatingDfiIdentification": "02100002",
"entries": [{
"transactionCode": "22",
"receivingDfiRouting": "026009593",
"receivingAccountNumber": "9876543210",
"amount": 3250.00,
"individualId": "EMP-1042",
"individualName": "JANE DOE"
}]
}
req = urllib.request.Request(url, json.dumps(payload).encode(), {"Content-Type": "application/json"})
items = json.loads(urllib.request.urlopen(req).read())
open("payroll.ach", "w").write(items[0]["achContent"])
3. Python — Parse Corporate `BAI2` to JSON/SQL
Unwrap `88` continuation lines and verify `49/98/99` control totals from JPMorgan, BofA CashPro, and Wells Fargo CEO statements before loading into Postgres or Snowflake.
Download bai2_to_json_and_csv.py →4. Python — Stripe/Shopify → German `DATEV` CSV
Generate certified `EXTF` v700 semicolon `Buchungsstapel` files (`SKR03` / `SKR04`) ready for German Steuerberater import in DATEV Rechnungswesen.
Download stripe_to_datev_skr04.py →5. Instant Terminal CLI (`npx`)
Run any of our 10 financial tools straight from CI/CD or terminal without installing a package:
npx github:Geornaden/finops-studio sepa payload.jsonExplore All 10 Cloud APIs →