E-Rechnung API: XRechnung und ZUGFeRD per REST prüfen
Senden Sie eine XRechnung (CII oder UBL) oder ein ZUGFeRD-/Factur-X-PDF per POST und erhalten Sie JSON zurück: gültig oder nicht, erkanntes Format und jede verletzte Regel mit Regel-ID, Originalmeldung und deutscher Kurzerklärung. Kostenlos 50 Prüfungen pro Monat, Schlüssel sofort und ohne Zahlung.
Kostenlosen API-Schlüssel holen
Auf einen Blick
- Endpoint:
POST /api/v1/validate - Auth:
Authorization: Bearer erk_…oderX-API-Key - Eingabe: XML-Body oder Multipart-Feld
file(XML/PDF), max. 2,5 MB - Regeln: Schematron EN 16931 + XRechnung 3.0.2 (KoSIT-Release), ohne XSD-Schemaprüfung
- Free: 50 Prüfungen / Monat, 60 Anfragen / Minute
- OpenAPI: openapi.json · openapi.yaml (3.1)
Schnellstart mit curl
XRechnung-XML direkt als Body senden:
curl -X POST https://erechnung-konverter.vercel.app/api/v1/validate \
-H "Authorization: Bearer $ERECHNUNG_API_KEY" \
-H "Content-Type: application/xml" \
--data-binary @rechnung.xmlZUGFeRD-/Factur-X-PDF oder XML als Datei-Upload (Multipart). Bei PDFs wird die erste eingebettete XML geprüft:
curl -X POST https://erechnung-konverter.vercel.app/api/v1/validate \
-H "Authorization: Bearer $ERECHNUNG_API_KEY" \
-F "file=@rechnung-zugferd.pdf"JavaScript (Node.js 18+)
import { readFile } from "node:fs/promises";
const xml = await readFile("rechnung.xml");
const res = await fetch("https://erechnung-konverter.vercel.app/api/v1/validate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ERECHNUNG_API_KEY}`,
"Content-Type": "application/xml",
},
body: xml,
});
const result = await res.json();
if (!res.ok) throw new Error(result.error.code + ": " + result.error.message);
console.log(result.valid, result.format, result.errors.map(e => e.rule));Den Schlüssel nur serverseitig verwenden (Umgebungsvariable), nie im Browser-Code ausliefern. Die API sendet keine CORS-Header.
Antwort
valid ist true, wenn keine Regel mit Fehlerstufe verletzt ist; Warnungen stehen separat in warnings. format ist CII oder UBL; XML ohne CII- oder UBL-Rechnungswurzel wird mit 400 not_an_einvoice abgelehnt (zählt nicht). message_de ist null, wenn es für eine Regel noch keine deutsche Erklärung gibt. Jede Regel-ID ist in unseren Fehlercodes erklärt.
{
"valid": false,
"format": "CII",
"document": "invoice",
"profile": "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0",
"rules": "KoSIT XRechnung 3.0.2 Schematron (CII: en16931 + xrechnung)",
"errors": [
{
"rule": "BR-DE-15",
"message": "Das Element \"Buyer reference\" (BT-10) muss übermittelt werden.",
"message_de": "Die Leitweg-ID bzw. Käuferreferenz (BT-10) fehlt."
}
],
"warnings": [
{
"rule": "BR-DE-TMP-32",
"message": "Eine Rechnung sollte zur Angabe des Liefer-/Leistungsdatums …",
"message_de": "Für das Liefer-/Leistungsdatum sollten entweder das Lieferdatum (BT-72) …"
}
],
"invoice": { "number": "123456XX", "total": "336.9" },
"usage": { "plan": "free", "limit": 50, "used": 3, "remaining": 47, "reset": "2026-11-01T00:00:00.000Z" }
}Header: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (Unix-Sekunden, Beginn des nächsten Monats UTC).
OpenAPI-Spezifikation
Die vollständige Beschreibung aller Endpunkte, Felder, Header und Fehlercodes gibt es als OpenAPI 3.1: /openapi.json (JSON) und /openapi.yaml (YAML).
- Postman: Import → Link →
https://erechnung-konverter.vercel.app/openapi.jsoneinfügen; den Schlüssel unter Authorization als Bearer Token setzen. - Insomnia: Import → From URL → dieselbe Adresse.
- Clients generieren: z. B. mit OpenAPI Generator oder
openapi-typescript.
Fehlerformat und Statuscodes
{ "error": { "code": "quota_exceeded", "message": "Freikontingent (50/Monat) aufgebraucht, …" } }| Status | error.code | Bedeutung |
|---|---|---|
| 400 | bad_request / not_an_einvoice / invalid_email | Leerer Body, Feld „file“ fehlt, PDF ohne eingebettete XML, DOCTYPE im XML, keine CII-/UBL-Rechnung |
| 401 | api_key_required / unauthorized | Kein oder ungültiger Schlüssel |
| 405 | method_not_allowed | Nur POST |
| 409 | email_exists | Für die E-Mail-Adresse gibt es schon einen Schlüssel |
| 413 | payload_too_large | Datei über 2,5 MB |
| 415 | unsupported_media_type | Content-Type nicht unterstützt |
| 429 | quota_exceeded / rate_limited | Monatskontingent aufgebraucht bzw. mehr als 60 Anfragen pro Minute (Header Retry-After) |
| 500 | internal_error | Prüfung fehlgeschlagen (zählt als Aufruf), bitte melden |
| 503 | storage_unavailable / service_unavailable | Vorübergehend nicht verfügbar, später erneut versuchen |
Gezählt wird jede Prüfung, die tatsächlich läuft (auch mit Ergebnis valid: false). Anfragen mit 4xx-Fehlern vor der Prüfung (400, 401, 413, 415, 429) zählen nicht.
Limits und Tarife
Free ist jetzt verfügbar. Bezahlte Tarife sind geplant und noch nicht buchbar; Preise pro Monat, Endpreise inkl. 19 % USt, Änderungen vorbehalten. Wer beim Schlüssel das Häkchen setzt, bekommt eine einmalige Nachricht zum Start (nach Bestätigung per Link).
Freejetzt verfügbar
0 € / Monat
50 Prüfungen / Monat
Startergeplant
15 € / Monat
2.000 Prüfungen / Monat
Growthgeplant
39 € / Monat
5.000 Prüfungen / Monat
Scalegeplant
79 € / Monat
15.000 Prüfungen / Monat
Was die API prüft und was nicht
- Geprüft werden die veröffentlichten Schematron-Regeln der KoSIT (EN 16931 und, bei XRechnung-Kennung, XRechnung 3.0.2) für CII und UBL. Eine XSD-Schemaprüfung findet nicht statt; das Ergebnis ist daher nicht identisch mit dem vollständigen KoSIT-Prüftool.
- Bei ZUGFeRD/Factur-X wird nur die eingebettete XML geprüft, nicht PDF/A-3 oder XMP-Metadaten.
- Rechnungsdateien werden nur im Arbeitsspeicher verarbeitet, nicht gespeichert und nicht an KI-Dienste übermittelt.
- Beta: kostenlos, ohne Verfügbarkeitszusage. Bei Missbrauch können Schlüssel gesperrt werden. Schlüssel verloren? Mail an stoertebeker@mail.grokbot.com.
Lieber im Browser prüfen? Zum kostenlosen Validator. Überblick für Suchende und Entscheider: XRechnung API im Überblick · ZUGFeRD API im Überblick · Factur-X API im Überblick.
In English
REST API to validate German/EU e-invoices: XRechnung (CII and UBL) and ZUGFeRD / Factur-X PDFs. POST /api/v1/validate with an XML body (Content-Type: application/xml) or a multipart file field (XML or PDF, max 2.5 MB), authenticated with Authorization: Bearer erk_…. The response is JSON: valid, detected format (CII/UBL), and errors/warnings as {rule, message, message_de}. Rules: published KoSIT Schematron for EN 16931 + XRechnung 3.0.2 (no XSD schema step). OpenAPI 3.1 spec: /openapi.json (or YAML), importable into Postman or Insomnia by URL. Errors use {"error": {"code", "message"}} with 401 for missing/invalid keys and 429 for quota or rate limits.
Free tier: 50 validations per month per key, 60 requests per minute; get a key instantly above (email only, no card). Paid tiers (planned, not yet available): €15 / 2,000, €39 / 5,000, €79 / 15,000 validations per month, prices include 19% German VAT. Invoice files are processed in memory only and never stored.