Skip to content

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.

Request
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"
  }'
Response · 201
{
  "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_ref
POST/verbindenCreate a one-time link to the connect flow
GET/verbindungenBank connections with status and consent
GET/kontenAccounts with IBAN, holder and balance
GET/konten/{id}/umsaetzeTransactions with filters von, bis, q, kategorie
GET/konten/{id}/saldenDaily balances
GET/konten/{id}/auszuegeStatements of an account
GET/konten/{id}/exportExport as camt053, mt940, csv or pdf
POST/importeUpload a file: camt, MT940, CSV, PDF
POST/sandbox/buchungSimulate a booking, sandbox only
One transaction, all fields
{
  "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 bank
umsaetze.neuNew transactions have arrived
auszug.neuNew statement
import.fertigFile import finished
einwilligung.laeuft_ab14, 7 and 1 day before expiry
einwilligung.abgelaufenConsent has expired
einwilligung.widerrufenEnd customer withdrew consent
verbindung.fehlerConnection disturbed, with code
abruf.fehlgeschlagenA retrieval failed
Verify the signature
import 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));
}
Body · umsaetze.neu
{
  "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.

MCP guide

konten_listeumsaetze_suchensaldenauszuege_listeverbindungen_listeverbinden_linkverbindung_aktualisierenendkunden_listestatistik

Sandbox

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 TAN
demo-appApproval in the app, granted after 10 seconds
falschError case: login rejected
abgelaufenConsent expires immediately

Simulate a booking and trigger umsaetze.neu:

POST /api/v1/sandbox/buchung
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

Ready for your first call?

Keys and sandbox are available after the review.

For developers · Agile Finance