canonical: https://jentic.com/apis/invowerk.dev/invowerk

# invowerk

The invowerk API checks German and European e-invoices against EN 16931 and the German rules, covering ZUGFeRD and Factur-X PDFs including PDF/A, XRechnung through the KoSIT validator, and Peppol BIS. It also reads an existing e-invoice into JSON keyed on EN 16931 Business Terms, converts invoices between UBL and CII syntax, creates a new UBL or CII e-invoice from JSON, and renders an XML invoice as readable HTML with the KoSIT visualization. An explain operation turns any rule code from a validation finding into a German or English description of what the rule requires and how to fix the invoice.

## For AI agents

Validate ZUGFeRD, Factur-X, XRechnung, and Peppol e-invoices, explain failed rules, parse invoices to JSON, convert between UBL and CII, and generate EN 16931 invoices.

## Scope

Does not handle sending invoices over Peppol, payment collection, or bookkeeping. Use for validating, parsing, converting, generating, and rendering e-invoice files only.

## Capabilities

- Validate a ZUGFeRD, Factur-X, XRechnung, or UBL/CII e-invoice against EN 16931 and German rules
- Explain a validation rule code in German or English with the cause and the fix
- Read an XML or ZUGFeRD PDF e-invoice into JSON keyed on EN 16931 Business Terms
- Convert an e-invoice between UBL and CII with target_syntax, optionally to the xrechnung flavor
- Generate an EN 16931 or XRechnung e-invoice from JSON with seller, buyer, lines, tax_breakdown, and totals
- Render an XML e-invoice as a readable HTML page

## Use cases

### AI bookkeeping agent checking incoming e-invoices

A developer's agent connected through Jentic finds the invowerk validate operation by intent and calls it with the X-API-Key injected at execution time. It submits each incoming XRechnung or ZUGFeRD file, asks for explained findings, and reports which invoices fail EN 16931 or German rules and why, without the key entering the agent's context.

Example prompt: POST `/v1/validate` with an XRechnung XML file as the body, explain true, and lang 'en', then list each failed rule with its fix

### Fixing a rejected invoice

When a public-sector portal rejects an invoice, the rejection carries rule codes that are hard to read. The explain operation returns, for each code, the title, what the rule requires, common causes, how to fix the invoice, and the affected Business Terms, and the parse operation returns the invoice as JSON that can be edited and sent back through generate.

Example prompt: GET `/v1/explain` with code 'BR-DE-15' and lang 'en', then POST `/v1/parse` on the invoice, add the missing field, and POST `/v1/generate` with the edited model

### Producing compliant e-invoices from billing data

German B2G and, increasingly, B2B billing requires structured e-invoices. The generate operation builds an EN 16931 invoice from JSON with required invoice_number, issue_date, seller, buyer, lines, tax_breakdown, and totals, in UBL or CII, and the xrechnung flavor requires buyer_reference, the Leitweg-ID. invowerk writes amounts as given rather than recalculating them.

Example prompt: POST `/v1/generate` with syntax 'cii', flavor 'xrechnung', buyer_reference set to the Leitweg-ID, and the seller, buyer, lines, tax_breakdown, and totals, then POST `/v1/validate` on the result

### Syntax conversion for a receiving system

A buyer's system may accept only UBL while a supplier sends CII, or the reverse. The convert operation takes XML or a ZUGFeRD or Factur-X PDF up to 20 MB, a required target_syntax of ubl or cii, and an optional target_flavor of en16931 or xrechnung.

Example prompt: POST `/v1/convert` with a ZUGFeRD PDF as the body and target_syntax 'ubl', then save the returned XML

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| POST | `/v1/validate` | Check an e-invoice |
| GET | `/v1/explain` | Explain a rule code |
| POST | `/v1/parse` | Read an e-invoice into JSON |
| POST | `/v1/convert` | Convert between UBL and CII |
| POST | `/v1/generate` | Create an e-invoice from JSON |
| POST | `/v1/render` | Render an e-invoice as HTML |
| GET | `/v1/me` | Plan, requests, and credits remaining |

## Key resources

- **Validation** — Check an e-invoice against EN 16931 and German rules, with optional explained findings
- **Explain** — Rule codes and IW-* notes explained in German or English
- **Parse and convert** — Read an e-invoice into JSON and convert between UBL and CII
- **Generate and render** — Create an EN 16931 or XRechnung invoice from JSON and render XML as HTML
- **Account** — Plan, remaining requests, and remaining credits

## AI readiness

This API is usable in Jentic One now. Its AI-readiness score against Jentic's framework shows where it stands today and where improvements would make it even easier for agents to use.

- **Score:** 73 / 100
- **Maturity:** AI-Aware
- **Dimensions:**
  - Foundational Compliance: 100 / 100
  - Developer Experience & Jentic Compatibility: 63 / 100
  - AI-Readiness & Agent Experience: 70 / 100
  - Agent Usability: 94 / 100
  - Security: 50 / 100
  - AI Discoverability: 75 / 100
- **View full report:** https://jentic.com/apis/invowerk.dev/invowerk/scorecard
- **How the score is calculated:** https://docs.jentic.com/reference/api-readiness-framework/overview/
- **More about the dimensions:** https://docs.jentic.com/reference/api-readiness-framework/specification/#dimensional-model-overview

### Score it yourself

Every API in the directory is allowlisted, so you can re-score it with no key required.

- **Score your own API:** https://jentic.com/scorecard.md
- **Scoring CLI agent skill:** https://github.com/jentic/jentic-api-scorecard/blob/main/skills/jentic-api-scorecard/SKILL.md

```sh
npx @jentic/api-scorecard-cli score <openapi-url>
```

## Why Jentic

- **Setup:** Wiring invowerk by hand means sending the X-API-Key header, picking the right body type for XML, PDF, or multipart uploads, and reading RFC 9457 problem codes and rate-limit headers. Through Jentic you install once, import invowerk from the API Directory, store the key once, and your agent calls it.
- **Permission scoping:** invowerk takes the invoice itself as the request body, so rules bound which operations your agent may call rather than which invoice it sends. You choose the operations it may call, so generating or converting invoices is not included unless you add it.
- **Credential handling:** Your invowerk API key is stored once, encrypted, by your own Jentic One instance and injected at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'validate an XRechnung' or 'convert UBL to CII', and Jentic returns the matching invowerk operation with its input schema so the agent calls the right endpoint without browsing the reference docs.

## Related APIs

- **Storecove** — Peppol access point for sending and receiving e-invoices
- **FastBill** — German invoicing and bookkeeping software
- **Invovate Invoice API** — Invoice PDF and UBL generation with server-side totals

## FAQ

### What authentication does the invowerk API use?

Per its OpenAPI spec, invowerk uses an API key sent in the `X-API-Key` request header on its operations. The spec notes that calls without a key run anonymously at a lower rate limit per IP address, and GET `/v1/me` reports whether your key was recognised. Through Jentic the key is stored by your own instance and attached at call time.

### Which e-invoice formats can invowerk validate?

POST `/v1/validate` accepts an XML invoice in UBL or CII, including XRechnung, or a ZUGFeRD or Factur-X PDF, sent as the raw body or a multipart file part of at most 20 MB. invowerk detects the format from the bytes and checks it against EN 16931 and the German rules.

### What are the rate limits for the invowerk API?

The OpenAPI spec does not state fixed numbers. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers, over-budget calls return 429 with Retry-After, and GET `/v1/me` returns your live budget.

### Is there an invowerk MCP server?

You don't need an MCP server to give your agent invowerk. Jentic connects it directly from the API Directory: import it, store your API key once, and your agent calls the validate, explain, and convert operations it needs, discovered on demand rather than loaded into its context.

### Can I limit what my agent is allowed to do with invowerk?

Yes. For example, write a rule that allows only POST `/v1/validate` and GET `/v1/explain`, so the agent can check invoices and explain their findings but cannot generate or convert invoices that spend credits, and every call it makes is logged.

### How do I validate an XRechnung through Jentic?

Import invowerk from the Jentic API Directory and store your X-API-Key once. Your agent searches for 'validate an e-invoice', gets POST `/v1/validate` with its schema, sends the XML as the body with explain set, and reads the findings. To run it on your own infrastructure, install Jentic One from its GitHub repo.
