SEPA XML a ISO 20022: pain.001 a camt.053

ISO 20022 je standard a katalog finančních zpráv, nikoli jediné XML schéma. SEPA používá konkrétní zprávy a další pravidla European Payments Council a přijímající banky.

Autor: Aktualizováno

Jak číst identifikátor

Pain.001 slouží pro zadání úhrad klientem; camt.053 pro výpis banky klientovi. Celý identifikátor obsahuje i variantu a verzi. Schéma jedné verze nelze bez ověření použít na jinou. Konkrétní definici vyhledej v oficiálním katalogu.

Jak číst identifikátor
urn:iso:std:iso:20022:tech:xsd:pain.001.001.09

Namespace určuje zprávu

Ilustrační fragment ukazuje obálku, není kompletní platební příkaz a proti XSD neprojde. CstmrCdtTrfInitn musí obsahovat další povinné skupiny podle vybrané verze.

Namespace určuje zprávu
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09">
 <CstmrCdtTrfInitn/>
</Document>

XSD není celý bankovní profil

Ověř schéma, kódové seznamy a implementační pravidla banky. SEPA profil může zpřísňovat volitelné elementy nebo hodnoty. To, že zpráva projde obecným XSD, neznamená, že ji banka přijme nebo platbu provede.

Aktuální SEPA dokumenty vybírej z knihovny EPC, nikoli z náhodně nalezené starší příručky.

Praktický postup integrace

Vyžádej bankovní specifikaci a ukázku, připni její verzi a testuj v prostředí banky. Používej přesné desetinné částky a jednotné identifikátory, kontroluj součty i stavové odpovědi. Změnu namespace neprováděj jako náhradu skutečné migrace dat.

Jak číst pain.001.001.09 po jednotlivých skupinách

platba.xml — výukový datový model, není pokyn k reálné platbě
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09">
 <CstmrCdtTrfInitn>
  <GrpHdr><MsgId>DEMO-20261002-1</MsgId><CreDtTm>2026-10-02T10:00:00Z</CreDtTm>
   <NbOfTxs>1</NbOfTxs><CtrlSum>12.50</CtrlSum><InitgPty><Nm>Ukázková firma</Nm></InitgPty>
  </GrpHdr>
  <PmtInf><PmtInfId>DEMO-DAVKA-1</PmtInfId><PmtMtd>TRF</PmtMtd>
   <NbOfTxs>1</NbOfTxs><CtrlSum>12.50</CtrlSum>
   <ReqdExctnDt><Dt>2026-10-05</Dt></ReqdExctnDt>
   <Dbtr><Nm>Ukázková firma</Nm></Dbtr>
   <DbtrAcct><Id><IBAN>DE12500105170648489890</IBAN></Id></DbtrAcct>
   <DbtrAgt><FinInstnId><BICFI>INGDDEFFXXX</BICFI></FinInstnId></DbtrAgt>
   <CdtTrfTxInf><PmtId><EndToEndId>DEMO-FAKTURA-1</EndToEndId></PmtId>
    <Amt><InstdAmt Ccy="EUR">12.50</InstdAmt></Amt>
    <Cdtr><Nm>Ukázkový příjemce</Nm></Cdtr>
    <CdtrAcct><Id><IBAN>DE89370400440532013000</IBAN></Id></CdtrAcct>
    <RmtInf><Ustrd>Výukový vzorek</Ustrd></RmtInf>
   </CdtTrfTxInf>
  </PmtInf>
 </CstmrCdtTrfInitn>
</Document>

GrpHdr popisuje celou zprávu: MsgId identitu, CreDtTm čas vzniku, NbOfTxs počet transakcí a CtrlSum kontrolní součet. PmtInf sdružuje platby se společnými údaji plátce a dnem provedení. CdtTrfTxInf je jednotlivá transakce, která obsahuje identifikátor EndToEndId, částku a příjemce. Zkratky Dbtr a Cdtr znamenají dlužníka/plátce a věřitele/příjemce.

Částka je desetinný text bez čárky, měna atribut Ccy. ReqdExctnDt v této verzi obsahuje volbu Dt, což nelze bez kontroly přenášet na všechny starší verze. Identita zprávy, dávky a obchodní platby má jiný účel; neposílej bez pravidel totéž id pro všechny úrovně.

Validace, namespace a bankovní přijetí

Strukturální kontrola s přesně odpovídajícím ISO XSD
xmllint --noout --schema pain.001.001.09.xsd platba.xml
  1. Vyber celý identifikátor zprávy podle dokumentace banky pro daný způsob předávání plateb. V oficiálním archivu ISO najdi odpovídající pain.001.001.09 a stáhni její XSD.
  2. Spusť kontrolu struktury. Namespace root musí být shodný s targetNamespace schématu.
  3. Zkus odebrat PmtMtd nebo nahradit částku textem abc: struktura či datový typ mají selhat.
  4. Zkus změnit jen CtrlSum z 12.50 na 13.50. Běžné XSD nemusí součet proti jednotlivým platbám porovnat; tuto chybu odhalí profil či aplikační kontrola.
  5. Teprve potom použij testovací prostředí banky a vyhodnoť odpověď, například pain.002 se stavem zprávy či transakce.

Ukázka slouží k orientaci v obecné zprávě. Banka může vyžadovat další údaje, konkrétní kódy či omezený SEPA profil. Validační XSD balíčky EPC mohou používat technické namespace pro vyjádření omezení; nejsou automaticky souborem, který máš odeslat bance. Skutečnou platební zprávu vytvářej podle dokumentace a požadavků konkrétní banky. Aktuální pravidla jsou v knihovně EPC.

Camt.053 je bankovní výpis, pain.002 stav iniciované platby a pacs zprávy slouží jiným mezibankovním procesům. Názvy nejsou zaměnitelné jen proto, že všechny zprávy používají XML. U příjmu ověř také duplicity, návaznost na původní identifikátory a přesnost částek; schéma nepotvrzuje provedení peněžní operace.

camt.053: příkaz k platbě a výpis jsou jiné zprávy

vypis.xml — úplný minimalistický camt.053.001.08
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.08">
 <BkToCstmrStmt>
  <GrpHdr><MsgId>DEMO-VYPIS-1</MsgId><CreDtTm>2026-10-02T10:00:00Z</CreDtTm></GrpHdr>
  <Stmt><Id>DEMO-UCET-1</Id><CreDtTm>2026-10-02T10:00:00Z</CreDtTm>
   <Acct><Id><IBAN>DE89370400440532013000</IBAN></Id><Ccy>EUR</Ccy></Acct>
   <Bal><Tp><CdOrPrtry><Cd>OPBD</Cd></CdOrPrtry></Tp><Amt Ccy="EUR">100.00</Amt><CdtDbtInd>CRDT</CdtDbtInd><Dt><Dt>2026-10-01</Dt></Dt></Bal>
   <Bal><Tp><CdOrPrtry><Cd>CLBD</Cd></CdOrPrtry></Tp><Amt Ccy="EUR">110.00</Amt><CdtDbtInd>CRDT</CdtDbtInd><Dt><Dt>2026-10-02</Dt></Dt></Bal>
   <Ntry><NtryRef>DEMO-ZAZNAM-1</NtryRef><Amt Ccy="EUR">10.00</Amt><CdtDbtInd>CRDT</CdtDbtInd><Sts><Cd>BOOK</Cd></Sts>
    <BookgDt><Dt>2026-10-02</Dt></BookgDt><BkTxCd><Prtry><Cd>DEMO</Cd></Prtry></BkTxCd>
   </Ntry>
  </Stmt>
 </BkToCstmrStmt>
</Document>

Pain.001 žádá banku o provedení plateb. Camt.053 předává výpis: GrpHdr identifikuje zprávu, Stmt jednotlivý výpis, Acct účet, Bal zůstatky a Ntry záznamy. OPBD je počáteční zaúčtovaný zůstatek a CLBD konečný zaúčtovaný zůstatek. Částka zůstává nezáporná, její směr určuje CRDT nebo DBIT. BOOK zde znamená zaúčtovaný záznam.

Jeden Ntry může obsahovat více transakcí v NtryDtls, proto počet Ntry není vždy počet obchodních plateb. Datum zaúčtování, valuta, identifikátor bankovního záznamu a EndToEndId mají odlišný účel. Proprietární transakční kód DEMO je pouze výukový údaj; jeho význam nepřebírej jako bankovní klasifikaci.

Schéma vyber podle přesného namespace
xmllint --noout --schema camt.053.001.08.xsd vypis.xml

Vzorek prošel odpovídajícím XSD z bankovního rozcestníku Rabobank, který poskytuje také pain.001.001.09. Nejde o splnění libovolného bankovního profilu. Stejné XSD nesmí být použito pro .02 ani přejmenované namespace.

read-camt.py — python3 read-camt.py; Python standardní knihovna
from decimal import Decimal
from pathlib import Path
import xml.etree.ElementTree as ET
path = Path("vypis.xml")
if path.stat().st_size > 1024 * 1024:
    raise ValueError("Limit výukového souboru")
ns = {"c": "urn:iso:std:iso:20022:tech:xsd:camt.053.001.08"}
root = ET.parse(path).getroot()  # pouze tento vlastní důvěryhodný vzorek
stmt = root.find("c:BkToCstmrStmt/c:Stmt", ns)
if stmt is None:
    raise ValueError("Chybí výpis správného namespace")
def signed(node):
    amount = node.find("c:Amt", ns)
    if amount is None or amount.get("Ccy") != "EUR":
        raise ValueError("Očekávána EUR částka")
    direction = node.findtext("c:CdtDbtInd", namespaces=ns)
    if direction not in ("CRDT", "DBIT"):
        raise ValueError("Neznámý směr částky")
    value = Decimal(amount.text)
    return value if direction == "CRDT" else -value
balances = {b.findtext("c:Tp/c:CdOrPrtry/c:Cd", namespaces=ns): signed(b)
            for b in stmt.findall("c:Bal", ns)}
entries = stmt.findall("c:Ntry", ns)
for entry in entries:
    if entry.findtext("c:Sts/c:Cd", namespaces=ns) != "BOOK":
        raise ValueError("Tento příklad očekává pouze zaúčtované záznamy")
    if entry.findtext("c:RvslInd", namespaces=ns) == "true":
        raise ValueError("Storno vyžaduje samostatné párovací pravidlo")
change = sum((signed(e) for e in entries), Decimal("0"))
if balances["OPBD"] + change != balances["CLBD"]:
    raise ValueError("Nesedí počáteční stav, pohyby a konečný stav")
print(len(entries), change, balances["CLBD"])

Čekej 1 10.00 110.00. Změň konečný zůstatek na 111.00: XML syntax i obecné XSD mohou projít, ale účetní kontrola selže. Změň měnu částky na CZK: ukázka ji odmítne místo sčítání různých měn. Pro bankovní import přidej podporu všech výpisů, stavů, detailů, storna, bankovních pravidel a párování duplicit; při obnově procesu se stejný záznam nesmí zaúčtovat dvakrát. Pro nedůvěryhodné XML použij zabezpečený parser, nikoli odvození důvěry z přípony souboru.