E-invoice checker for ZUGFeRD, Factur-X, XRechnung and Peppol BIS. Free web tool, API and MCP.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional API key; the anonymous tier works without it
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Convert an e-invoice to UBL or CII. The result is checked before it is returned. Input: `invoice_base64` is the base64 of an XML invoice or a ZUGFeRD / Factur-X PDF, at most 4 MB decoded; or pass the file as a download link in `file`. `target_syntax` is "ubl" or "cii". `target_flavor` is optional, "en16931" or "xrechnung"; without it the flavor of the source is kept. Returns `xml`, `syntax`, `flavor` and `self_validation` (`valid`, `finding_count`). invowerk checks the converted XML before answering and never returns an invalid document. Input that cannot be read or converted fails with an error message. Credits: 3 per call.
Syntax to convert to: "ubl" or "cii".
The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL.
Optional: "en16931" or "xrechnung". Without it the flavor of the source is kept.
The invoice file, base64-encoded. At most 4 MB decoded.
Convert an e-invoice to UBL or CII. The result is checked before it is returned. Input: `invoice_base64` is the base64 of an XML invoice or a ZUGFeRD / Factur-X PDF, at most 4 MB decoded; or pass the file as a download link in `file`. `target_syntax` is "ubl" or "cii". `target_flavor` is optional, "en16931" or "xrechnung"; without it the flavor of the source is kept. Returns `xml`, `syntax`, `flavor` and `self_validation` (`valid`, `finding_count`). invowerk checks the converted XML before answering and never returns an invalid document. Input that cannot be read or converted fails with an error message. Credits: 3 per call.
| Argument | Type | Description |
|---|---|---|
| file | object | The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL. |
| target_flavor | any | Optional: "en16931" or "xrechnung". Without it the flavor of the source is kept. |
| target_syntax* | string | Syntax to convert to: "ubl" or "cii". |
| invoice_base64 | any | The invoice file, base64-encoded. At most 4 MB decoded. |
{
"type": "object",
"required": [
"target_syntax"
],
"properties": {
"file": {
"type": "object",
"default": null,
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name."
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"description": "A public https URL of the file."
}
},
"description": "The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL."
},
"target_flavor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional: \"en16931\" or \"xrechnung\". Without it the flavor of the source is kept."
},
"target_syntax": {
"type": "string",
"description": "Syntax to convert to: \"ubl\" or \"cii\"."
},
"invoice_base64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The invoice file, base64-encoded. At most 4 MB decoded."
}
},
"additionalProperties": false
}Explain rule codes in plain language. Works without an API key. Covers the codes of `validate_invoice` findings and hints: EN 16931, XRechnung, ZUGFeRD and invowerk's own hint codes (IW-*). Input: `codes` is a list of one or more codes, e.g. ["BR-CO-18", "BR-DE-21"]. Duplicates are removed. `lang` is "de" (default) or "en". Returns `lang` and `explanations`. Each explanation has `title`, `meaning`, `causes`, `fixes`, `severity`, `standard`, `bt_refs`, `xpath_hints` and `explain_url` (the German page for the code). If any code is unknown, the call fails and names the unknown codes. Credits: free. This tool is not metered.
| Argument | Type | Description |
|---|---|---|
| lang | string | Language of the explanations: "de" (default) or "en". |
| codes* | array | One or more rule codes from validate_invoice, e.g. ["BR-CO-18", "BR-DE-21"]. |
{
"type": "object",
"required": [
"codes"
],
"properties": {
"lang": {
"enum": [
"de",
"en"
],
"type": "string",
"default": "de",
"description": "Language of the explanations: \"de\" (default) or \"en\"."
},
"codes": {
"type": "array",
"items": {
"type": "string"
},
"description": "One or more rule codes from validate_invoice, e.g. [\"BR-CO-18\", \"BR-DE-21\"]."
}
},
"additionalProperties": false
}Create a valid EN 16931 e-invoice (UBL or CII XML) from JSON. Input: `invoice` is a JSON object keyed on EN 16931 Business Terms, the same schema as `POST /v1/generate`, at most 4 MB. Main fields: `syntax` ("ubl" default, or "cii"), `flavor` ("en16931" default, or "xrechnung", which requires `buyer_reference`, the Leitweg-ID BT-10, and `payment_iban`), `invoice_number`, `issue_date` (YYYY-MM-DD), `currency`, `seller`, `buyer`, `lines`, `tax_breakdown`, `totals`. invowerk writes your amounts as given. It does not compute or correct them. Input that breaks an EN 16931 or XRechnung rule returns an error naming each rule, e.g. BT-112 = BT-109 + BT-110 (BR-CO-15). Dates are YYYY-MM-DD, amounts go up to 999,999,999.99. Returns `xml`, `syntax`, `flavor` and `self_validation`. invowerk checks the XML before answering and never returns an invalid document. Invalid input, or XML that fails the check, returns an error, as does a busy (`engine_busy`) or overrunning (`engine_timeout`) generate. Credits: 5 per call.
| Argument | Type | Description |
|---|---|---|
| invoice* | object | The invoice as a JSON object keyed on EN 16931 Business Terms, the schema of POST /v1/generate and of parse_invoice's `model`: syntax, flavor, invoice_number, issue_date, currency, seller, buyer, lines, tax_breakdown, totals. |
{
"type": "object",
"required": [
"invoice"
],
"properties": {
"invoice": {
"type": "object",
"description": "The invoice as a JSON object keyed on EN 16931 Business Terms, the schema of POST /v1/generate and of parse_invoice's `model`: syntax, flavor, invoice_number, issue_date, currency, seller, buyer, lines, tax_breakdown, totals.",
"additionalProperties": true
}
},
"additionalProperties": false
}Read an existing e-invoice into JSON keyed on EN 16931 Business Terms. The JSON is the input format of `generate_invoice`, so you can edit it and create the invoice again. Input: `invoice_base64` is the base64 of an XML invoice (UBL or CII) or a ZUGFeRD / Factur-X PDF, at most 4 MB decoded; or pass the file as a download link in `file`. A PDF may have at most 500 pages and 16 attachments. Returns `model` (the invoice as JSON), `detection` (`syntax`, `flavor`, `customization_id`) and `source` ("xml" or "pdf-embedded"). A file that cannot be read fails with an error that starts with an error code, e.g. a PDF without embedded XML, a UBL credit note, malformed XML, or a busy (`engine_busy`) or overrunning (`engine_timeout`) read. Credits: 2 per call.
| Argument | Type | Description |
|---|---|---|
| file | object | The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL. |
| invoice_base64 | any | The invoice file, base64-encoded. At most 4 MB decoded. |
{
"type": "object",
"properties": {
"file": {
"type": "object",
"default": null,
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name."
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"description": "A public https URL of the file."
}
},
"description": "The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL."
},
"invoice_base64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The invoice file, base64-encoded. At most 4 MB decoded."
}
},
"additionalProperties": false
}Render an XML e-invoice (UBL or CII, e.g. XRechnung) as a readable HTML page. invowerk uses the KoSIT XRechnung visualization. Use it to show a person what an e-invoice contains. Input: `invoice_base64` is the base64 of the XML, at most 4 MB decoded, or pass the file as a download link in `file`. PDFs are not accepted. `lang` sets the label language, "de" (default) or "en". Returns `html` (a complete HTML document), `lang`, `flavor` (e.g. "xrechnung") and `syntax` (e.g. "ubl_invoice"). A file that is not an XML invoice, malformed XML or XML with a DOCTYPE fails with an error message, and so does a busy (`engine_busy`) or overrunning (`engine_timeout`) render. Credits: 1 per call.
| Argument | Type | Description |
|---|---|---|
| file | object | The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL. |
| lang | string | Language of the labels: "de" (default) or "en". |
| invoice_base64 | any | The invoice file, base64-encoded. At most 4 MB decoded. |
{
"type": "object",
"properties": {
"file": {
"type": "object",
"default": null,
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name."
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"description": "A public https URL of the file."
}
},
"description": "The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL."
},
"lang": {
"enum": [
"de",
"en"
],
"type": "string",
"default": "de",
"description": "Language of the labels: \"de\" (default) or \"en\"."
},
"invoice_base64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The invoice file, base64-encoded. At most 4 MB decoded."
}
},
"additionalProperties": false
}Check an e-invoice against EN 16931 and German rules. Input: `invoice_base64` is the base64 of an XML invoice (UBL or CII) or a ZUGFeRD / Factur-X PDF, at most 4 MB decoded; or pass the file as a download link in `file`. `explain=true` adds an explanation to findings whose rule has one, in `lang` ("de" or "en"). `valid` is the result. For XRechnung the KoSIT validator decides. If it is unreachable, invowerk's own check with the same rules decides, `verdict_source` is "local" and `official_degraded` is true. `disagreement` is true when both ran and differ. `findings` lists each problem with `rule_id`, `severity` and `message`; pass the codes to `explain_errors` (free). `pdfa_verdict` is the PDF/A check of a PDF. `hints` never change `valid`. Unreadable input returns a finding, not an error. It fails with an error when the check is busy (`engine_busy`), ran longer than 20 s (`engine_timeout`) or the XML has more than 100,000 elements (`document_too_complex`). Credits: 1 per call.
| Argument | Type | Description |
|---|---|---|
| file | object | The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL. |
| lang | string | Language of the explanations: "de" (default) or "en". |
| explain | boolean | true adds an explanation to each finding whose rule has one. |
| invoice_base64 | any | The invoice file, base64-encoded. At most 4 MB decoded. |
{
"type": "object",
"properties": {
"file": {
"type": "object",
"default": null,
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name."
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"description": "A public https URL of the file."
}
},
"description": "The file as a download link, instead of `invoice_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL."
},
"lang": {
"enum": [
"de",
"en"
],
"type": "string",
"default": "de",
"description": "Language of the explanations: \"de\" (default) or \"en\"."
},
"explain": {
"type": "boolean",
"default": false,
"description": "true adds an explanation to each finding whose rule has one."
},
"invoice_base64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The invoice file, base64-encoded. At most 4 MB decoded."
}
},
"additionalProperties": false
}