For ERP, industry software and SaaS
E-invoices that pass every check. Through an API.
One JSON call returns a calculated XRechnung (UBL or CII) and ZUGFeRD, checked with the KoSIT validator.
20 test invoices, no payment details. OpenAPI description to download.
For management and productBuild or integrate? The business case at a glance
# sellerId: ID of your seller from the portal
curl -X POST https://api.fakturnaut.com/v1/invoices \
-H "Authorization: Bearer $FAKTURNAUT_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen 2>/dev/null || cat /proc/sys/kernel/random/uuid)" \
--data @- <<'JSON'
{
"sellerId": "5b1d7f0e-3c2a-4e8b-9f61-2d4c8a7e9b03",
"number": "RE-2026-0042",
"issueDate": "2026-11-02",
"dueDate": "2026-12-02",
"buyerReference": "PO-4711",
"buyer": {
"name": "Muster GmbH",
"electronicAddress": "rechnung@muster-gmbh.example",
"electronicAddressScheme": "EM",
"address": {
"street": "Musterstraße 1",
"city": "Berlin",
"postCode": "10115",
"country": "DE"
}
},
"lines": [
{
"name": "Softwarelizenz November",
"quantity": 1,
"unitCode": "C62",
"netPrice": 490,
"vatRate": 19
},
{
"name": "Einrichtung",
"quantity": 4,
"unitCode": "HUR",
"netPrice": 95,
"vatRate": 19
}
]
}
JSON// sellerId: ID of your seller from the portal
const invoice = {
"sellerId": "5b1d7f0e-3c2a-4e8b-9f61-2d4c8a7e9b03",
"number": "RE-2026-0042",
"issueDate": "2026-11-02",
"dueDate": "2026-12-02",
"buyerReference": "PO-4711",
"buyer": {
"name": "Muster GmbH",
"electronicAddress": "rechnung@muster-gmbh.example",
"electronicAddressScheme": "EM",
"address": {
"street": "Musterstraße 1",
"city": "Berlin",
"postCode": "10115",
"country": "DE"
}
},
"lines": [
{
"name": "Softwarelizenz November",
"quantity": 1,
"unitCode": "C62",
"netPrice": 490,
"vatRate": 19
},
{
"name": "Einrichtung",
"quantity": 4,
"unitCode": "HUR",
"netPrice": 95,
"vatRate": 19
}
]
};
const response = await fetch('https://api.fakturnaut.com/v1/invoices', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.FAKTURNAUT_KEY}`, // fkn_test_…
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify(invoice),
});
const issued = await response.json();<?php
// sellerId: ID of your seller from the portal
$invoice = <<<'JSON'
{
"sellerId": "5b1d7f0e-3c2a-4e8b-9f61-2d4c8a7e9b03",
"number": "RE-2026-0042",
"issueDate": "2026-11-02",
"dueDate": "2026-12-02",
"buyerReference": "PO-4711",
"buyer": {
"name": "Muster GmbH",
"electronicAddress": "rechnung@muster-gmbh.example",
"electronicAddressScheme": "EM",
"address": {
"street": "Musterstraße 1",
"city": "Berlin",
"postCode": "10115",
"country": "DE"
}
},
"lines": [
{
"name": "Softwarelizenz November",
"quantity": 1,
"unitCode": "C62",
"netPrice": 490,
"vatRate": 19
},
{
"name": "Einrichtung",
"quantity": 4,
"unitCode": "HUR",
"netPrice": 95,
"vatRate": 19
}
]
}
JSON;
$ch = curl_init('https://api.fakturnaut.com/v1/invoices');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('FAKTURNAUT_KEY'), // fkn_test_…
'Content-Type: application/json',
'Idempotency-Key: ' . bin2hex(random_bytes(16)),
],
CURLOPT_POSTFIELDS => $invoice,
]);
$issued = json_decode(curl_exec($ch), true);// sellerId: ID of your seller from the portal
String invoice = """
{
"sellerId": "5b1d7f0e-3c2a-4e8b-9f61-2d4c8a7e9b03",
"number": "RE-2026-0042",
"issueDate": "2026-11-02",
"dueDate": "2026-12-02",
"buyerReference": "PO-4711",
"buyer": {
"name": "Muster GmbH",
"electronicAddress": "rechnung@muster-gmbh.example",
"electronicAddressScheme": "EM",
"address": {
"street": "Musterstraße 1",
"city": "Berlin",
"postCode": "10115",
"country": "DE"
}
},
"lines": [
{
"name": "Softwarelizenz November",
"quantity": 1,
"unitCode": "C62",
"netPrice": 490,
"vatRate": 19
},
{
"name": "Einrichtung",
"quantity": 4,
"unitCode": "HUR",
"netPrice": 95,
"vatRate": 19
}
]
}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.fakturnaut.com/v1/invoices"))
.header("Authorization", "Bearer " + System.getenv("FAKTURNAUT_KEY")) // fkn_test_…
.header("Content-Type", "application/json")
.header("Idempotency-Key", UUID.randomUUID().toString())
.POST(HttpRequest.BodyPublishers.ofString(invoice))
.build();
HttpResponse<String> issued = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());// sellerId: ID of your seller from the portal
var invoice = """
{
"sellerId": "5b1d7f0e-3c2a-4e8b-9f61-2d4c8a7e9b03",
"number": "RE-2026-0042",
"issueDate": "2026-11-02",
"dueDate": "2026-12-02",
"buyerReference": "PO-4711",
"buyer": {
"name": "Muster GmbH",
"electronicAddress": "rechnung@muster-gmbh.example",
"electronicAddressScheme": "EM",
"address": {
"street": "Musterstraße 1",
"city": "Berlin",
"postCode": "10115",
"country": "DE"
}
},
"lines": [
{
"name": "Softwarelizenz November",
"quantity": 1,
"unitCode": "C62",
"netPrice": 490,
"vatRate": 19
},
{
"name": "Einrichtung",
"quantity": 4,
"unitCode": "HUR",
"netPrice": 95,
"vatRate": 19
}
]
}
""";
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.fakturnaut.com/v1/invoices")
{
Content = new StringContent(invoice, Encoding.UTF8, "application/json"),
};
request.Headers.Authorization = new AuthenticationHeaderValue(
"Bearer", Environment.GetEnvironmentVariable("FAKTURNAUT_KEY")); // fkn_test_…
// A new key per invoice; reuse it only when you retry this request.
request.Headers.Add("Idempotency-Key", Guid.NewGuid().ToString());
var issued = await http.SendAsync(request); // http: your shared HttpClientResponse, shortened
{
"id": "0c9e6a52-71f4-4b8d-a3e2-6f5d9b1c2e47",
"number": "RE-2026-0042",
"typeCode": "380",
"amountDue": 1035.3,
"currency": "EUR",
"findings": [],
"documents": [
{
"format": "xrechnung-ubl",
"href": "/v1/invoices/0c9e6a52-71f4-4b8d-a3e2-6f5d9b1c2e47/document?format=xrechnung-ubl"
},
{
"format": "zugferd",
"href": "/v1/invoices/0c9e6a52-71f4-4b8d-a3e2-6f5d9b1c2e47/document?format=zugferd"
}
]
}- EN 16931
- XRechnung UBL
- XRechnung CII
- ZUGFeRD
- Peppol
- KoSIT-Validator
- OpenAPI
- Servers in Frankfurt
- DE · RO
For developers
One call, three steps, no standards to read
POST /v1/invoicesSend the invoice as JSON
Seller, buyer, lines, tax rates. With an Idempotency-Key, so a retry never issues twice.
findings: []Calculated and checked
Totals and VAT under EN 16931. Every invoice goes through the KoSIT validator; deviations come back as findings.
documents · webhooksDeliver
Fetch XRechnung UBL/CII and ZUGFeRD, deliver over Peppol, hear about every status change by webhook.
For management and product
Solve your customers' e-invoicing mandate without in-house standards know-how.
On the market in time
Your customers must issue e-invoices from 1 January 2027 or 2028. You connect an interface instead of starting a standards project.
Less risk
Every invoice is checked with the official KoSIT validator before it goes out. The rules of the standard live in Fakturnaut, not in your code.
Predictable costs
From €49 a month for 250 invoices, billed monthly or yearly. No project budget.
Build or integrate?
| Task | Build it yourself | With Fakturnaut |
|---|---|---|
| Understand EN 16931 and XRechnung | Your team learns the standard | Built into the API |
| Create three formats | Build and maintain UBL, CII and the ZUGFeRD PDF | One JSON call |
| Official check | Integrate and run the KoSIT validator yourself | Included with every invoice |
| Delivery | E-mail sending and a Peppol connection | Peppol included in Growth, Scale and Enterprise |
| Several clients | Your own data model for sellers | Several sellers per account |
| Changes to the standard | Permanently in your own backlog | Normative XRechnung releases: live within 4 weeks of the final KoSIT bundle, and always before they take effect. Code list updates within 2 weeks. ZUGFeRD: within 4 weeks of the FeRD release. Running 3.0 and 4.0 side by side during the transition period is included. |
| Cost | About 30–60 developer days once to move to XRechnung 4.0 / EN 16931-1:2026, then about 15–25 days a year for 4–6 releases and monitoring, plus running the validator. At €800 a day: about €24k–48k once plus €13k–21k a year. | from €49 a month |
For developers
What the API brings
OpenAPI description
Generate clients instead of typing them. Examples in curl, TypeScript, PHP, Java and C#.
Idempotent calls
The same Idempotency-Key never issues an invoice twice.
Webhooks
Your system learns about delivery and status changes without polling.
Several sellers
Each of your customers is a seller with its own sellerId, all in one account.
Peppol
Via Peppol on the Growth, Scale and Enterprise plans. Sending by e-mail: in preparation. Germany and Romania are supported today.
Run in Frankfurt
Servers in the EU, a public status page.
Self-billing (Gutschriften): in preparation
Access on request: write to us.
Prefer an SDK? There are SDKs for TypeScript, PHP, Java and C#. Guide: create an XRechnung via API
Pricing by invoices issued
Try free for 30 days: 20 test invoices, no payment details, ends by itself.
StarterTo start
€49a month, net
To get started.
- 250 invoices a month
- arithmetically €0.20 per invoice
- XRechnung UBL/CII and ZUGFeRD
- Unlimited checking
- Peppol in test only
- Sellers in Germany
Growth
€249a month, net
For growing numbers of customers.
- 2,500 invoices a month
- arithmetically €0.10 per invoice
- XRechnung UBL/CII and ZUGFeRD
- Unlimited checking
- Delivery over Peppol
Scale
€749a month, net
For large invoice volumes.
- 15,000 invoices a month
- arithmetically €0.05 per invoice
- XRechnung UBL/CII and ZUGFeRD
- Unlimited checking
- Delivery over Peppol
- Target: 99.9% availability
Enterprise
from €1,500a month, net
By agreement.
- More than 15,000 invoices
- Payment by invoice
The price depends on the invoices issued and the active sellers per month. Checking is unlimited on every plan. All pricing details
All prices are net in euros plus statutory VAT. Paid plans are billed monthly or yearly, by card or SEPA Direct Debit through Stripe; Enterprise by invoice, by agreement. Monthly terms can be cancelled every month, yearly terms at their end.
The price list and the terms are binding.
Only writing your own invoices? The app starts at €0.
GoBD: what Fakturnaut covers
What Fakturnaut covers
- Stored invoices cannot be changed and are secured with a checksum.
- Corrections only through corrective invoices.
As a business you remain responsible for retention and your procedure documentation. Not tax or legal advice.
Sources: Section 147 AO · Section 14b UStG. Not tax or legal advice.
Frequently asked questions
Is there a sandbox?
Yes. The trial runs 30 days with up to 20 test invoices and needs no payment details. The invoices carry the note "TESTRECHNUNG"; Peppol is simulated in the test.
Sources: Sandbox
Do I have to rebuild my software?
No. Your software sends the invoice data as JSON to our API. We take care of format, calculation and checking, and of sending if you want.
Sources: Quickstart
What happens with a duplicate call?
With the same Idempotency-Key the API does not issue a second invoice.
How do I pay?
By card or SEPA Direct Debit through Stripe; your plan is active at once. Enterprise customers pay by invoice as agreed.
Sources: Terms
Which formats does the API create?
XRechnung 3.0 in UBL and CII, ZUGFeRD/Factur-X in the EN 16931 profile and, for Romania, RO e-Factura. We validate every file we create with the KoSIT validator and rules.
Sources: XRechnung (KoSIT) · ZUGFeRD (FeRD)
Do I need Peppol?
Not necessarily. German law does not prescribe a transmission channel for e-invoices between businesses; e-mail is allowed too. Many public-sector buyers accept invoices via Peppol. Peppol is included on the Growth, Scale and Enterprise plans.
Sources: Questions and answers on e-invoicing (Federal Ministry of Finance) · E-invoices to the federal government (e-rechnung-bund.de)
Where are the servers?
In Frankfurt am Main in the EU. The privacy policy and the data processing agreement describe how we process data.
Sources: Privacy policy · Data processing agreement
What happens from 2027 and 2028?
Since 1 January 2025, businesses in Germany must be able to receive e-invoices. From 1 January 2027, businesses with more than €800,000 turnover in the previous year issue invoices to other domestic businesses as e-invoices; from 1 January 2028, all others do.
Sources: Section 27(38) UStG · BMF letter of 15 October 2025 · Questions and answers on e-invoicing (Federal Ministry of Finance)
Do you support self-billing?
We are preparing self-billed invoices in the sense of German VAT law (Gutschriften, invoice type 389); access is available on request. Corrections and cancellation invoices that refer to the original invoice can already be issued through the API.
Sources: Section 14 UStG
How fast is the integration?
You send your first test invoice within minutes. How long connecting your software takes depends on how your invoice data is structured; the API fields follow the EN 16931 standard.
Sources: Quickstart
Who is liable for the content of the invoice?
Whoever issues the invoice remains responsible for its content and correctness. We create the file, validate it against the technical rules and deliver it. Our terms set out the details.
Sources: Terms · Section 14 UStG
These answers are not tax or legal advice.
The first checked XRechnung from your code, today.
30 days, 20 test invoices, no payment details.