For developers
From key to first transaction in a few calls.
A REST API with an OpenAPI description, signed webhooks, MCP access and a test bank that behaves like a real bank, with TAN, app approval and error cases.
API
Base path /api/v1, authentication with a bearer key (agile_finance_test_… or agile_finance_live_…). Amounts in whole cents, debits negative. Idempotency-Key for POST, rate limit in the headers, paging by cursor.
You get keys after approval in the app under Developers.
curl -s https://finance.agiledeveloper.de/api/v1/verbinden \
-H "Authorization: Bearer $AF_KEY" \
-H "Content-Type: application/json" \
-d '{
"endkunde_extern_ref": "kunde-4711",
"quelle": "testbank",
"zurueck_url": "https://ihre-plattform.example/bank/fertig"
}'{
"url": "https://finance.agiledeveloper.de/verbinden/vb_8Yk2…",
"gueltig_bis": "2026-11-02T09:30:00.000Z",
"endkunde_id": "3c1f8a90-6d24-4b1e-8f37-1a2b9c0d7e65"
}POST/endkundenCreate end customers, with your own identifier extern_refPOST/verbindenCreate a one-time link to the connect flowGET/verbindungenBank connections with status and consentGET/kontenAccounts with IBAN, holder and balanceGET/konten/{id}/umsaetzeTransactions with filters von, bis, q, kategorieGET/konten/{id}/saldenDaily balancesGET/konten/{id}/auszuegeStatements of an accountGET/konten/{id}/exportExport as camt053, mt940, csv or pdfPOST/importeUpload a file: camt, MT940, CSV, PDFPOST/sandbox/buchungSimulate a booking, sandbox only{
"id": "0b7c3f52-8a1e-4c67-9d10-5f2a6e1b3c44",
"konto_id": "7e19d0c2-34ab-4f8e-a6d1-92c05b7f1e30",
"buchung": "2026-11-02",
"wertstellung": "2026-11-02",
"betrag_cent": -95000,
"waehrung": "EUR",
"verwendungszweck": "Miete 11/2026",
"gegen_name": "Hausverwaltung Sonnenhof",
"gegen_iban": "DE89370400440532013000",
"gegen_bic": null,
"bank_ref": "TB2026110201",
"end_to_end": null,
"mandat_ref": null,
"glaeubiger_id": null,
"buchungstext": "DAUERAUFTRAG",
"gvc": "152",
"vorgemerkt": false,
"kategorie": "miete",
"wiederkehrend": true,
"erstellt": "2026-11-02T06:14:09.000Z"
}Statement types: bank_pdf is the bank’s original, camt the file, report our own PDF, always marked as “not a bank document”. Retrieval over PSD2 has no original PDF, “statement” there means the transactions.
Webhooks
Every delivery carries agile-event, agile-delivery and agile-signature (t=timestamp, v1=HMAC-SHA256 over “t.rawbody”). We retry failed deliveries. The body always contains the environment, never credentials.
verbindung.aktivEnd customer connected their bankumsaetze.neuNew transactions have arrivedauszug.neuNew statementimport.fertigFile import finishedeinwilligung.laeuft_ab14, 7 and 1 day before expiryeinwilligung.abgelaufenConsent has expiredeinwilligung.widerrufenEnd customer withdrew consentverbindung.fehlerConnection disturbed, with codeabruf.fehlgeschlagenA retrieval failedimport crypto from "node:crypto";
function echt(rohdaten, kopf, geheimnis) {
const { t, v1 } = Object.fromEntries(
kopf.split(",").map((teil) => teil.split("=")),
);
const soll = crypto.createHmac("sha256", geheimnis)
.update(`${t}.${rohdaten}`).digest("hex");
return crypto.timingSafeEqual(Buffer.from(soll), Buffer.from(v1));
}{
"id": "f6a1c2d8-2b45-4e90-b7c3-0d9e8f7a6b51",
"typ": "umsaetze.neu",
"erstellt": "2026-11-02T06:14:11.000Z",
"daten": {
"umgebung": "sandbox",
"verbindung_id": "5d2e7b14-90ac-4f33-8e21-6c7d1a0f9b28",
"abruf_id": "a93e0c71-5f18-4d2a-b6e4-3f8c2d1e7a06",
"neu": 3
}
}MCP
AI assistants such as Claude or ChatGPT connect to /mcp via OAuth 2.1. The tools read data, create connect links and trigger fetches. None of them reveals credentials or deletes anything.
konten_listeumsaetze_suchensaldenauszuege_listeverbindungen_listeverbinden_linkverbindung_aktualisierenendkunden_listestatistikSandbox
A dedicated test bank with three accounts, new bookings every day and statements as PDF and camt.053. Free and unlimited after approval, never counts towards billing.
Test bank logins (BLZ 00000000, PIN demo, TAN 123456)
demoNormal flow with TANdemo-appApproval in the app, granted after 10 secondsfalschError case: login rejectedabgelaufenConsent expires immediatelySimulate a booking and trigger umsaetze.neu:
curl -s https://finance.agiledeveloper.de/api/v1/sandbox/buchung \
-H "Authorization: Bearer $AF_KEY" \
-H "Content-Type: application/json" \
-d '{"konto_id":"KONTO_ID","betrag_cent":-1299,"verwendungszweck":"Testkauf"}'Errors
Errors always arrive as { fehler: { code, nachricht, details } }. The code decides whether a retry makes sense, never the text.
zugang_falschtan_falschtan_noetigeinwilligung_abgelaufenbank_nicht_erreichbarbank_lehnt_abnicht_unterstuetztrate_limitlive_bank_gesperrt