Developer Portal & API Reference

REST API for converting Excel/CSV files to ISO 20022 PAIN.001 XML. This page covers authentication, the available endpoints, and request/response examples.

API Documentation

Authentication

All API requests must include the x-api-key header.

Use TEST_KEY_123 to test in our sandbox environment.

Endpoints

POST/api/v1/convert

Converts 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.

POST/api/v1/sepa/generate

Generates 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.

Supported Banks

Universal SEPA (All 27+ EU Countries)

Default ISO-20022 PAIN.001.001.03 format guaranteed to work with any standard European bank.

Standard Compliant

Bank-Specific Rules & Quirks

We automatically handle character limits, encoding (ISO-8859-1), and required fields unique to these institutions:

  • Citibank
  • Deutsche Bank
  • HSBC
  • ING
  • BNP Paribas
  • Soc. Générale
  • Santander
  • BBVA
  • Sparkasse
  • Intesa Sanpaolo
  • UniCredit
  • Erste Bank

Address Compliance

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.

Code Examples

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));

Responses & Error Codes

<?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.

API Playground

Deutsche Bank (V09)