REST API for converting Excel/CSV files to ISO 20022 PAIN.001 XML. This page covers authentication, the available endpoints, and request/response examples.
All API requests must include the x-api-key header.
Use TEST_KEY_123 to test in our sandbox environment.
/api/v1/convertConverts a file using a saved mapping profile. Create a profile once in the dashboard by mapping your columns to get a profile_id, then send the raw file plus that ID — no column mapping, bank type, or company info needs to be repeated in the request. bankType, column mapping, and company details are all read from the profile.
curl -X POST https://www.exceltopain001.com/api/v1/convert \ -H "x-api-key: YOUR_API_KEY" \ -F "file=@data.xlsx" \ -F "profile_id=prof_8k2m9..."
Max file size 5MB. Returns 400 if profile_id is missing or unknown, or if the file is missing required columns per the profile's mapping.
/api/v1/sepa/generateGenerates a PAIN.001 XML file from an explicit JSON payload or an uploaded file with a manually supplied bankType. Use this endpoint when you don't want to create a mapping profile up front. See the code examples below for the request format.
Default ISO-20022 PAIN.001.001.03 format guaranteed to work with any standard European bank.
We automatically handle character limits, encoding (ISO-8859-1), and required fields unique to these institutions:
Both endpoints already support the structured-address fields required by the SEPA structured address mandate taking effect in November 2026. Address columns are detected, parsed, and mapped into the structured XML fields automatically — no changes needed on your side ahead of the deadline.
Examples for /api/v1/sepa/generate:
curl -X POST https://www.exceltopain001.com/api/v1/sepa/generate \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"bankType": "DEUTSCHE_BANK",
"companyName": "Acme Corp",
"transactions": [
{
"debtorIban": "DE12345678901234567890",
"creditorName": "John Doe",
"creditorIban": "DE98765432109876543210",
"amount": 100.5,
"currency": "EUR",
"remittanceInfo": "Invoice #123"
}
]
}'import requests
url = "https://www.exceltopain001.com/api/v1/sepa/generate"
headers = {
"Content-Type": "application/json",
"x-api-key": "YOUR_API_KEY"
}
payload = {
"bankType": "DEUTSCHE_BANK",
"companyName": "Acme Corp",
"transactions": [
{
"debtorIban": "DE12345678901234567890",
"creditorName": "John Doe",
"creditorIban": "DE98765432109876543210",
"amount": 100.5,
"currency": "EUR",
"remittanceInfo": "Invoice #123"
}
]
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())const axios = require('axios');
const url = 'https://www.exceltopain001.com/api/v1/sepa/generate';
const headers = { 'x-api-key': 'YOUR_API_KEY' };
const payload = {
"bankType": "DEUTSCHE_BANK",
"companyName": "Acme Corp",
"transactions": [
{
"debtorIban": "DE12345678901234567890",
"creditorName": "John Doe",
"creditorIban": "DE98765432109876543210",
"amount": 100.5,
"currency": "EUR",
"remittanceInfo": "Invoice #123"
}
]
};
axios.post(url, payload, { headers })
.then(res => console.log(res.data))
.catch(err => console.error(err));<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>ABC-123456</MsgId>
...
</GrpHdr>
</CstmrCdtTrfInitn>
</Document>{
"status": "error",
"message": "Missing mandatory field 'creditorIban' in row 2. Please map it.",
"errors": ["Row 2: creditorIban: Required"]
}Returned when the x-api-key is missing or invalid.