CAMT.053 und MT940 per Kontoauszug-API in CSV, XLSX, MT940 oder CAMT.053 umwandeln. Bei fehlenden Angaben kann eine weitere Anfrage nötig sein.
Diese Funktion ist in der Beta: Sie funktioniert und ist getestet, Details können sich noch ändern.
Auf dieser Seite
Die Kontoauszug-API von Klarbon wandelt die CAMT.053- und MT940-Dateien, die Banken ohnehin bereitstellen, per REST in CSV, XLSX, MT940 oder CAMT.053 um. Sie liest den Auszug und liefert die Datei mit einer Vorschau auf Konto, Zeitraum, Salden und die ersten Umsätze. Berechnet wird nur eine erfolgreiche Umwandlung. Die Dateien werden für die Anfrage verarbeitet, ohne Dokumentenarchiv.
Was die API macht
POST /api/v1/bank/convert mit target auf bank-csv, xlsx, mt940 oder camt-053.
Eine Quelldatei kann mehrere Auszugsdateien ergeben. Fehlt eine Angabe oder ist eine Auswahl nötig, antwortet die API mit status: "need". Senden Sie dieselbe Datei mit Ihrer Antwort und resume erneut. Eine need-Antwort ist kostenlos; die abgeschlossene Umwandlung wird berechnet.
Für eine MT940-Ausgabe müssen Sie statementNumber in der Anfrage angeben.
Die CSV hat feste Spalten. Ordnen Sie sie den Feldern Ihres Importprogramms zu und prüfen Sie dessen Datums- und Dezimaleinstellungen.
Was sie nicht macht
PDF-Kontoauszüge liest sie noch nicht, und sie verbindet sich nicht mit Banken. Das Lesen von CAMT.053 und MT940 ist in der Beta. Ein JSON-Zielformat gibt es nicht: Die Vorschau in der Antwort ist eine Zusammenfassung, kein vollständiger Auszug.
Schnellstart
Jedes Beispiel macht denselben Aufruf. Vor der Veröffentlichung läuft jedes einzelne gegen einen lokalen Klarbon-Server und die echte Validierung.
Legen Sie auf Ihrer Kontoseite einen Schlüssel an und setzen Sie ihn als KLARBON_API_KEY. Der Schlüssel gehört nie in die Adresse.
import { readFile, writeFile } from "node:fs/promises"
type KlarbonFile = { content: string; filename: string; mime: string; bytes: number }
type Failure = { ok: false; error: string; message: string }
type Converted = { ok: true; status: "converted"; files: KlarbonFile[]; credits: { spent: number; balance: number } }
type Need = { ok: true; status: "need"; need: string; resume: string }
const form = new FormData()
form.append("file", new Blob([await readFile("statement.xml")], { type: "application/xml" }), "statement.xml")
form.append("target", "bank-csv")
const response = await fetch("https://klarbon.app/api/v1/bank/convert", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KLARBON_API_KEY}`,
"Idempotency-Key": "statement-2026-11-04-csv",
},
body: form,
})
const result = (await response.json()) as Converted | Need | Failure
if (!result.ok) throw new Error(`${response.status} ${result.error}: ${result.message}`)
if (result.status === "need") throw new Error(`Klarbon needs ${result.need}: send it with resume`)
for (const file of result.files) await writeFile(file.filename, Buffer.from(file.content, "base64"))
console.log(`${result.files.length} file(s) written, ${result.credits.balance} credits left`)
Python 3.9+, requests
import base64
import os
import requests
with open("statement.xml", "rb") as upload:
response = requests.post(
"https://klarbon.app/api/v1/bank/convert",
headers={
"Authorization": f"Bearer {os.environ['KLARBON_API_KEY']}",
"Idempotency-Key": "statement-2026-11-04-csv",
},
files={"file": ("statement.xml", upload, "application/xml")},
data={"target": "bank-csv"},
timeout=120,
)
result = response.json()
if not result["ok"]:
raise SystemExit(f"{response.status_code} {result['error']}: {result['message']}")
if result["status"] == "need":
raise SystemExit(f"Klarbon needs {result['need']}: send it with resume")
for written in result["files"]:
with open(written["filename"], "wb") as output:
output.write(base64.b64decode(written["content"]))
print(len(result["files"]), "file(s) written,", result["credits"]["balance"], "credits left")
using System.Net.Http.Headers;
using System.Text.Json;
using var http = new HttpClient();
var key = Environment.GetEnvironmentVariable("KLARBON_API_KEY");
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", key);
var upload = new ByteArrayContent(await File.ReadAllBytesAsync("statement.xml"));
upload.Headers.ContentType = new MediaTypeHeaderValue("application/xml");
using var request = new HttpRequestMessage(HttpMethod.Post, "https://klarbon.app/api/v1/bank/convert?target=bank-csv") { Content = upload };
request.Headers.Add("Idempotency-Key", "statement-2026-11-04-csv");
using var response = await http.SendAsync(request);
using var json = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
var result = json.RootElement;
if (!result.GetProperty("ok").GetBoolean())
{
Console.Error.WriteLine($"{(int)response.StatusCode} {result.GetProperty("error")}: {result.GetProperty("message")}");
return 1;
}
if (result.GetProperty("status").GetString() == "need")
{
Console.Error.WriteLine($"Klarbon needs {result.GetProperty("need")}: send it with resume");
return 1;
}
foreach (var written in result.GetProperty("files").EnumerateArray())
{
await File.WriteAllBytesAsync(written.GetProperty("filename").GetString()!,
Convert.FromBase64String(written.GetProperty("content").GetString()!));
}
Console.WriteLine($"{result.GetProperty("files").GetArrayLength()} file(s) written, {result.GetProperty("credits").GetProperty("balance")} credits left");
return 0;
Die Antwort
Die Antwort auf den curl-Aufruf oben, aufgezeichnet bei diesem Lauf mit Klarbon synthetic fixture, CC0-1.0.
Für die Seite gekürzt: files[0].content: base64 cut
Vorausbezahlte API-Pakete, per Karte auf Ihrer Kontoseite gekauft: 1.000 Aufrufe für 39,00 €, 5.000 Aufrufe für 129,00 €, 25.000 Aufrufe für 449,00 €, 100.000 Aufrufe für 990,00 €, ohne Ablaufdatum. Ihr erster Schlüssel bringt 25 kostenlose Aufrufe. Kostenpflichtige Aufrufe verbrauchen zuerst das API-Guthaben, danach dieselben Credits wie die Website. Ein fehlgeschlagener Aufruf kostet nichts.
Aufruf
Kosten
POST /open
Kostenlos, faire Nutzung bis 1.000 am Tag pro Konto
POST /check
Kostenlos im Tageslimit Ihres Tarifs (20 am Tag im kostenlosen Tarif)
POST /convert, POST /make
1 Aufruf, nur wenn die erzeugte Datei gültig ist
POST /bank/convert
1 Aufruf je angefangene 500 Umsätze, nur bei erfolgreicher Umwandlung
Grenzen
Dateien bis 20 MB, PDFs bis 50 Seiten.
60 Anfragen pro Minute je Schlüssel, 120 je Konto. Eine 429 enthält Retry-After.
Bis zu 10 Schlüssel pro Konto. Idempotency-Key gilt 24 Stunden, ein erneuter Versuch wird also nie doppelt berechnet.
Fehler
Jeder Fehler ist { ok: false, error, message }: ein fester Code und ein klarer Satz.
Status
Code
Wann
401
auth
Kein Schlüssel oder ein unbekannter oder widerrufener Schlüssel.
402
no_credits
API-Guthaben und Credits reichen beide nicht. Nichts wurde ausgeführt; topUpUrl nennt die Kaufseite.
413
too_large
Über 20 MB oder 50 PDF-Seiten.
415
unsupported
Ein Dateiformat, das die Route nicht annimmt.
422
invalid
Die Datei war nicht lesbar oder die erzeugte Datei ist nicht gültig. Nicht berechnet.
429
limit
Ein Ratenlimit oder die kostenlosen Aufrufe des Tages.
503
engine_unavailable
Die Validierung ist kurz nicht erreichbar. Nicht berechnet.
Datenschutz
Dateien werden für die Anfrage verarbeitet, ohne ein Dokumentenarchiv anzulegen. Die Anwendungsprotokolle von Klarbon enthalten weder Dateinamen noch Inhalte noch Schlüssel. Der vollständige Schlüssel wird nicht gespeichert, nur ein HMAC davon und ein kurzes Anzeigepräfix.
CAMT.053 und MT940 sowie weitere strukturierte Bankformate in der Beta. PDF-Kontoauszüge sind geplant und werden noch nicht angeboten.
In welche Formate kann sie umwandeln?
CSV, XLSX, MT940 und CAMT.053 sowie unterstützte Beta-Ausgaben. Der Parameter target wählt ein Format pro Aufruf; die Antwort kann mehrere Auszugsdateien enthalten.
Was passiert bei mehreren Auszügen in einer Datei?
Die Antwort kann für jeden Auszug eine Datei liefern. Fehlt eine Angabe oder ist eine Kontowahl nötig, lautet der Status need. Senden Sie dieselbe Datei mit Ihrer Antwort und resume erneut. Eine need-Antwort ist kostenlos; eine abgeschlossene Umwandlung wird berechnet.
Verbindet sich die API mit meiner Bank?
Nein. Sie senden eine Datei, die Ihre Bank bereits exportiert hat. Klarbon fragt nie nach Zugangsdaten.