Pain001 runs on Python 3.10, 3.11, and 3.12 (each version tested in CI) on macOS, Linux, and Windows. Install what you need; every optional capability is an extra, so the base install stays lean.
01. PyPI#
| What you need | Command |
|---|---|
| Core CLI & Python library | pip install pain001 |
| REST API microservice (FastAPI + Uvicorn) | pip install "pain001[api]" |
| Parquet ingestion (PyArrow) | pip install "pain001[parquet]" |
PGP-encrypted input files (.gpg / .asc) | pip install "pain001[gpg]" |
| Redis-backed async job queue for the API | pip install "pain001[redis]" |
| OpenTelemetry tracing | pip install "pain001[otel]" |
| Built-in minimal MCP / LSP servers | pip install "pain001[mcp]" / "pain001[lsp]" |
Companion packages install separately and are versioned independently:
Verify the install and explore the message catalogue:
02. Docker#
Multi-architecture images (linux/amd64, linux/arm64) are published to GitHub Container Registry. The container runs as a dedicated non-root user.
# Generate XML from a local CSV
# Launch the REST API
03. Locked-down environments#
Bank and treasury environments often prohibit dynamic plugin loading. Two controls exist for exactly that case:
PAIN001_DISABLE_PLUGINS=1disables all third-party plugin discovery; only bundled loaders run.pain001 plugins list/pain001 plugins show <name>make every discovered plugin auditable before first use.
Everything executes locally. No package in the suite phones home, calls a SaaS API, or moves payment data off the host.
04. First file in three commands#
--dry-run validates against the JSON Schema, the XSD, and (with --scheme) a SEPA or cross-border rulebook without writing output. Exit code 0 means the file passed those checks: the schema, and the scheme rulebook where selected. Your bank's own profile and channel rules are separate, and still require bank testing. Drop --dry-run to write the XML.
Continue to the Technical Reference for every flag and endpoint, or the Quickstart FAQ for operational questions.
