Paulibytes UG (haftungsbeschränkt) Kontoauszüge API
Kontoauszüge, Kontoberichte und Avise (camt.052/053/054) sowie Gebührenabrechnungen (camt.086) prüfen und als JSON lesen, einzeln oder als ZIP.
Kontoauszüge, Kontoberichte und Avise (camt.052/053/054) sowie Gebührenabrechnungen (camt.086) prüfen und als JSON lesen, einzeln oder als ZIP.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/finisma-de:finisma-de-kontoausz-ge-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: finisma REST Kontoauszüge API
version: 1.0.0
description: Elektronische Rechnungen (ZUGFeRD/Factur-X, EN 16931) prüfen und erzeugen. Server-zu-Server-API; nicht für Browser-Aufrufe gedacht. Authentifizierung per API-Key (Bearer fnsm_…), erstellt unter /konto, oder OAuth 2.1 (Bearer fnso_…) für Integrationen, die das Konto des Nutzers verbinden. verify ist kostenlos (Credential nötig), invoices läuft mit Abo, Guthaben (Credits, 1 je Rechnung) oder dem kostenlosen Tageskontingent mit Wasserzeichen, extractions läuft mit Abo oder kostet 1 Credit je Aufruf (Sprachmodell). payments/validate und statements/validate haben ein kostenloses Tageskontingent je Konto, danach Zahlungsverkehr-Abo oder Prüfblock (1 Credit für 10 Prüfungen); statements/parse hat ein kostenloses Monatskontingent, danach Zahlungsverkehr-Abo oder 1 Credit je Aufruf (Details je Endpunkt, x-finisma-pricing). Operationen mit x-finisma-mcp-tool gibt es unter demselben Tool-Namen auch auf dem Remote-MCP-Server /api/mcp.
termsOfService: https://finisma.de/agb
contact:
name: finisma
email: erechnung@paulibytes.de
url: https://finisma.de/entwickler
servers:
- url: https://finisma.de/api/v1
security:
- bearerAuth: []
- oauth2:
- invoice:verify
- invoice:create
tags:
- name: Kontoauszüge
description: Kontoauszüge, Kontoberichte und Avise (camt.052/053/054) sowie Gebührenabrechnungen (camt.086) prüfen und als JSON lesen, einzeln oder als ZIP.
paths:
/statements/validate:
post:
operationId: validateBankStatement
summary: Kontoauszug prüfen (camt.052/053/054, camt.086)
tags:
- Kontoauszüge
description: 'Prüft camt.052, camt.053 und camt.054 (Versionen .02 und .08) sowie camt.086 (.01 bis .05), einzeln oder mehrere Dateien als ZIP. Je Datei: Nachricht, Version, Befunde der Prüfregeln (Salden, Summen, IBAN-Prüfziffern, Reihenfolge, bei camt.086 Menge mal Preis und Steuern), Schemaprüfung gegen das ISO-Schema mit Zeile und Spalte, Urteil; dazu ein Gesamturteil. Nichts wird gespeichert. Kostenlos bis 5 Aufrufe pro Tag und Konto. Mit dem Zahlungsverkehr-Abo (Feature payments) ohne Limit. Ohne Abo kauft 1 Credit einen Prüfblock mit 10 weiteren Prüfungen (für Zahlungsdateien und Kontoauszüge gemeinsam, ohne Ablaufdatum). Ein Konto (API-Key oder OAuth) ist immer nötig.'
x-finisma-mcp-tool: validate_bank_statement
x-finisma-pricing:
freeQuota: 5
freePeriod: day
subscriptionFeature: payments
checkBlock:
credits: 1
checks: 10
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
format: binary
description: 'Die Datei: eine XML-Datei oder ein ZIP mit mehreren XML-Dateien (max. 10 MB).'
required:
- file
application/json:
schema:
type: object
properties:
xml:
type: string
description: Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'.
file_base64:
type: string
contentEncoding: base64
description: 'Die Datei Base64-kodiert: eine XML-Datei oder ein ZIP mit mehreren XML-Dateien (max. 10 MB). Alternativ ''xml''.'
filename:
type: string
description: Optionaler Dateiname, erscheint in den Meldungen.
additionalProperties: false
responses:
'200':
description: Ergebnis; billing nennt, womit bezahlt wurde.
content:
application/json:
schema:
type: object
properties:
summary:
type: string
description: Kurzfassung des Ergebnisses.
result:
type: object
properties:
files:
type: array
items:
type: object
properties:
name:
type: string
message:
type: string
enum:
- camt.052
- camt.053
- camt.054
- camt.086
version:
type: string
description: Schema-Version, z. B. 08.
statements:
type: integer
items:
type: integer
description: Buchungen bzw. Services (camt.086).
findings:
type: array
items:
type: object
properties:
code:
type: string
description: Maschinencode der Prüfregel.
severity:
type: string
enum:
- error
- warning
- info
message:
type: string
description: Deutsche Meldung.
path:
type: string
description: Punkt-Pfad in das gelesene Modell.
required:
- code
- severity
- message
xsd:
type: object
description: 'Schemaprüfung über den Validierungsdienst. available=false heißt: nicht verfügbar, das Urteil beruht dann nur auf den Prüfregeln.'
properties:
available:
type: boolean
ruleset:
type: string
description: Prüfgrundlage, z. B. iso.20022:camt053:08.
valid:
type: boolean
verdict:
type: string
enum:
- valid
- valid_with_warnings
- invalid
errorCount:
type: integer
warningCount:
type: integer
findings:
type: array
items:
type: object
properties:
code:
type: string
severity:
type: string
enum:
- error
- warning
- info
message:
type: string
line:
type:
- integer
- 'null'
column:
type:
- integer
- 'null'
location:
type:
- string
- 'null'
required:
- code
- severity
- message
note:
type: string
required:
- available
- ruleset
verdict:
type: string
enum:
- valid
- valid_with_warnings
- invalid
required:
- name
- message
- version
- findings
- xsd
- verdict
deliveryFindings:
type: array
items:
type: object
properties:
code:
type: string
description: Maschinencode der Prüfregel.
severity:
type: string
enum:
- error
- warning
- info
message:
type: string
description: Deutsche Meldung.
path:
type: string
description: Punkt-Pfad in das gelesene Modell.
required:
- code
- severity
- message
skipped:
type: array
description: Dateien im ZIP-Archiv, die keine unterstützte camt-Datei sind.
items:
type: object
properties:
name:
type: string
reason:
type: string
required:
- name
- reason
verdict:
type: string
enum:
- valid
- valid_with_warnings
- invalid
schemaChecked:
type: boolean
description: false, wenn die Schemaprüfung für mindestens eine Datei nicht verfügbar war.
billing:
type: object
description: 'Womit der Aufruf bezahlt wurde: free_quota (Freikontingent), subscription (Zahlungsverkehr-Abo), check_block (Prüfblock: 1 Credit für 10 Prüfungen) oder credit (Guthaben).'
properties:
via:
type: string
enum:
- free_quota
- subscription
- check_block
- credit
freeRemaining:
type:
- integer
- 'null'
description: Verbleibende kostenlose Aufrufe im laufenden Zeitraum (Europe/Berlin); beim Abo null.
freePeriod:
type: string
enum:
- day
- month
description: 'Zeitraum des Freikontingents: day beim Prüfen, month beim Auslesen.'
checkBlockRemaining:
type: integer
description: 'Nur bei via check_block: offene Prüfungen im Prüfblock nach diesem Aufruf.'
creditsCharged:
type: integer
description: 'Abgebuchte Credits: bei via credit und beim Kauf eines neuen Prüfblocks.'
refunded:
type: boolean
description: true, wenn der Aufruf zurückgebucht wurde, weil die Schemaprüfung nicht erreichbar war.
required:
- via
- freeRemaining
- freePeriod
required:
- files
- deliveryFindings
- skipped
- verdict
- billing
required:
- summary
- result
'400':
description: Keine Datei, kein unterstütztes Format oder eine nicht unterstützte Version (code invalid_input). Abgewiesene Dateien kosten nichts.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: Kein oder ungültiges Credential.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: Tageskontingent (5 pro Tag) aufgebraucht, keine offene Prüfung im Prüfblock, kein Zahlungsverkehr-Abo und kein Guthaben (code payment_required). Retry-After nennt die Sekunden bis zum Neubeginn des Kontingents (Mitternacht, Europe/Berlin).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'413':
description: Datei größer als 10 MB (code payload_too_large).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Rate-Limit (30/min je Key).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: Fehler im nachgelagerten Dienst.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/statements/parse:
post:
operationId: parseBankStatement
summary: Kontoauszug als JSON lesen (camt.052/053/054, camt.086)
tags:
- Kontoauszüge
description: 'Liest dieselben Formate in strukturiertes JSON: bei camt.052/053/054 Konten, Salden und Buchungen mit Transaktionen (Gegenpartei, IBAN, Verwendungszweck, End-to-End-Referenz, BkTxCd mit GVC), bei camt.086 Abrechnungen mit Services und Summen je Währung. Keine Schemaprüfung. Nichts wird gespeichert. Kostenlos bis 5 Aufrufe pro Monat und Konto. Mit dem Zahlungsverkehr-Abo (Feature payments) ohne Limit. Ohne Abo kostet jeder weitere Aufruf 1 Credit. Ein Konto (API-Key oder OAuth) ist immer nötig.'
x-finisma-mcp-tool: parse_bank_statement
x-finisma-pricing:
freeQuota: 5
freePeriod: month
subscriptionFeature: payments
creditsPerCall: 1
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
format: binary
description: 'Die Datei: eine XML-Datei oder ein ZIP mit mehreren XML-Dateien (max. 10 MB).'
required:
- file
application/json:
schema:
type: object
properties:
xml:
type: string
description: Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'.
file_base64:
type: string
contentEncoding: base64
description: 'Die Datei Base64-kodiert: eine XML-Datei oder ein ZIP mit mehreren XML-Dateien (max. 10 MB). Alternativ ''xml''.'
filename:
type: string
description: Optionaler Dateiname, erscheint in den Meldungen.
additionalProperties: false
responses:
'200':
description: Ergebnis; billing nennt, womit bezahlt wurde.
content:
application/json:
schema:
type: object
properties:
summary:
type: string
description: Kurzfassung des Ergebnisses.
result:
type: object
properties:
files:
type: array
items:
type: object
description: 'Eine gelesene Datei. statements folgt dem Modell aus @erechnung/camt: bei camt.052/053/054 je Auszug account, balances, summary und entries (bookingDate, valueDate, amount, currency, creditDebit, status, bankTxCode mit gvc, transactions[] mit counterparty, remittance, refs.endToEndId); bei camt.086 je Abrechnung account, services, taxRegions, balances.'
properties:
name:
type: string
message:
type: string
enum:
- camt.052
- camt.053
- camt.054
- camt.086
version:
type: string
header:
type: object
statements:
type: array
items:
type: object
totals:
type: array
description: 'Nur camt.086: Summen je Preiswährung.'
items:
type: object
properties:
currency:
type: string
services:
type: integer
net:
type: number
waived:
type: number
tax:
type: number
gross:
type: number
settlementTotals:
type: array
description: 'Nur camt.086: Belastung in abweichender Abrechnungswährung.'
items:
type: object
properties:
value:
type: number
currency:
type: string
services:
type: integer
parseFindings:
type: array
items:
type: object
properties:
code:
type: string
description: Maschinencode der Prüfregel.
severity:
type: string
enum:
- error
- warning
- info
message:
type: string
description: Deutsche Meldung.
path:
type: string
description: Punkt-Pfad in das gelesene Modell.
required:
- code
- severity
- message
required:
- name
- message
- version
- header
- statements
- parseFindings
skipped:
type: array
description: Dateien im ZIP-Archiv, die keine unterstützte camt-Datei sind.
items:
type: object
properties:
name:
type: string
reason:
type: string
required:
- name
- reason
billing:
type: object
description: 'Womit der Aufruf bezahlt wurde: free_quota (Freikontingent), subscription (Zahlungsverkehr-Abo), check_block (Prüfblock: 1 Credit für 10 Prüfungen) oder credit (Guthaben).'
properties:
via:
type: string
enum:
- free_quota
- subscription
- check_block
- credit
freeRemaining:
type:
- integer
- 'null'
description: Verbleibende kostenlose Aufrufe im laufenden Zeitraum (Europe/Berlin); beim Abo null.
freePeriod:
type: string
enum:
- day
- month
description: 'Zeitraum des Freikontingents: day beim Prüfen, month beim Auslesen.'
checkBlockRemaining:
type: integer
description: 'Nur bei via check_block: offene Prüfungen im Prüfblock nach diesem Aufruf.'
creditsCharged:
type: integer
description: 'Abgebuchte Credits: bei via credit und beim Kauf eines neuen Prüfblocks.'
refunded:
type: boolean
description: true, wenn der Aufruf zurückgebucht wurde, weil die Schemaprüfung nicht erreichbar war.
required:
- via
- freeRemaining
- freePeriod
required:
- files
- skipped
- billing
required:
- summary
- result
'400':
description: Keine Datei, kein unterstütztes Format oder eine nicht unterstützte Version (code invalid_input). Abgewiesene Dateien kosten nichts.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: Kein oder ungültiges Credential.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: Monatskontingent (5 pro Monat) aufgebraucht, kein Zahlungsverkehr-Abo und kein Guthaben (code payment_required). Retry-After nennt die Sekunden bis zum Neubeginn des Kontingents (Monatsanfang, Europe/Berlin).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'413':
description: Datei größer als 10 MB (code payload_too_large).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Rate-Limit (30/min je Key).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: Fehler im nachgelagerten Dienst.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
components:
schemas:
Error:
type: object
properties:
error:
type: string
description: Menschenlesbare Fehlermeldung.
code:
type: string
enum:
- invalid_input
- auth_required
- invalid_key
- subscription_required
- free_quota_exhausted
- payment_required
- payload_too_large
- insufficient_scope
- rate_limited
- not_found
- upstream_error
details:
description: Optionale strukturierte Details, z. B. Validierungs-Issues.
required:
- error
- code
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: API-Key (fnsm_…) aus dem finisma-Konto unter /konto oder OAuth-Zugriffstoken (fnso_…).
oauth2:
type: oauth2
description: OAuth 2.1 mit PKCE (S256). Clients können sich per Dynamic Client Registration unter /api/oauth/register selbst anmelden.
flows:
authorizationCode:
authorizationUrl: https://finisma.de/api/oauth/authorize
tokenUrl: https://finisma.de/api/oauth/token
refreshUrl: https://finisma.de/api/oauth/token
scopes:
invoice:verify: E-Rechnungen prüfen
invoice:create: ZUGFeRD-Rechnungen erzeugen