Skip to content

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 product
Build 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 HttpClient

Response, 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

  1. POST /v1/invoices

    Send the invoice as JSON

    Seller, buyer, lines, tax rates. With an Idempotency-Key, so a retry never issues twice.

  2. findings: []

    Calculated and checked

    Totals and VAT under EN 16931. Every invoice goes through the KoSIT validator; deviations come back as findings.

  3. documents · webhooks

    Deliver

    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?

TaskBuild it yourselfWith Fakturnaut
Understand EN 16931 and XRechnungYour team learns the standardBuilt into the API
Create three formatsBuild and maintain UBL, CII and the ZUGFeRD PDFOne JSON call
Official checkIntegrate and run the KoSIT validator yourselfIncluded with every invoice
DeliveryE-mail sending and a Peppol connectionPeppol included in Growth, Scale and Enterprise
Several clientsYour own data model for sellersSeveral sellers per account
Changes to the standardPermanently in your own backlogNormative 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.
CostAbout 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.

Try free for 30 days