pain.001 is the *payments initiation* message: a corporate's instruction to its bank to debit the corporate's account and credit one or more beneficiaries. It is the workhorse of SEPA SCT, cross-border CBPR+ MX, and most domestic ISO 20022 rails.
The version that matters today is pain.001.001.09. CGI-MP v3 (the Common Global Implementation Market Practice) profiles a single subset for cross-border + multi-currency, and country variants like Swiss pain.001.001.09.ch.03 add local overlays (QR-IBAN handling, QR-bill reference embedding, NbOfTxs/CtrlSum rules).
The message is built around three layers: GroupHdr (the envelope — MsgId, CreDtTm, NbOfTxs, CtrlSum, InitgPty), one or more PmtInf blocks (one per debit account / payment method / requested execution date), and inside each PmtInf one or more CdtTrfTxInf blocks (one per beneficiary transaction). Batch payroll fits this naturally: one PmtInf with N CdtTrfTxInf children.
iso-compliant emits pain.001 deterministically at POST /v1/iso20022/pain.001, with structured-address enforcement turned on for the SWIFT Nov 14, 2026 mandate. See the builder at apps/api/src/lib/pain001-builder.ts and the public route at apps/api/src/routes/pain001.ts.