Die E-Rechnungs-API, die die Umsatzsteuer mitdenkt
Ein Format-Renderer gibt dir valides XML zurück — auch mit der falschen Steuerkategorie. Hier läuft jede Rechnung vor der Auslieferung durch den amtlichen KoSIT-Validator. Stimmt die Steuer nicht, bekommst du HTTP 400 statt eines Belegs, den dein Mandant zwei Jahre später erklären muss.
Abgerechnet wird die fertige Rechnung. Nicht der API-Call, nicht die Seite, nicht der Versuch.
from factora import FactoraClient
client = FactoraClient(api_key="fa_live_...")
invoice = client.create_atomic_invoice({
"api_mode": "atomic_single_post",
"invoice_header": {
"invoice_number": "RE-2026-0042",
"invoice_date": "2026-08-06",
"buyer_reference": "04011000-12345-34",
"profile": "xrechnung",
},
"validation_totals": {
"net_amount": "1500.00",
"vat_amount": "285.00",
"gross_amount": "1785.00",
},
"seller_snapshot": {...},
"buyer": {...},
"items": [...],
})
print(invoice["valid"], invoice["data"]["profile"]) curl -X POST https://console.factora.software/api/v1/invoices/atomic/ \
-H "Authorization: Bearer fa_live_..." \
-H "Idempotency-Key: 8f14e45f-ea6b-4f1d-9a1e-3b0f2c7d1a55" \
-H "Content-Type: application/json" \
-d '{
"api_mode": "atomic_single_post",
"invoice_header": {
"invoice_number": "RE-2026-0042",
"invoice_date": "2026-08-06",
"buyer_reference": "04011000-12345-34",
"profile": "xrechnung"
},
"validation_totals": {
"net_amount": "1500.00",
"vat_amount": "285.00",
"gross_amount": "1785.00"
},
"seller_snapshot": { "name": "Muster GmbH", "...": "" },
"buyer": { "name": "Kunde AG", "...": "" },
"items": [{ "description": "Beratung", "...": "" }]
}' $client = new GuzzleHttpClient();
$response = $client->post('https://console.factora.software/api/v1/invoices/atomic/', [
'headers' => [
'Authorization' => 'Bearer fa_live_...',
'Idempotency-Key' => '8f14e45f-ea6b-4f1d-9a1e-3b0f2c7d1a55',
],
'json' => [
'api_mode' => 'atomic_single_post',
'invoice_header' => [
'invoice_number' => 'RE-2026-0042',
'invoice_date' => '2026-08-06',
'buyer_reference' => '04011000-12345-34',
'profile' => 'xrechnung',
],
'validation_totals' => [...],
'seller_snapshot' => [...],
'buyer' => [...],
'items' => [...],
],
]);
$invoice = json_decode($response->getBody(), true); const response = await fetch(
"https://console.factora.software/api/v1/invoices/atomic/",
{
method: "POST",
headers: {
"Authorization": "Bearer fa_live_...",
"Idempotency-Key": "8f14e45f-ea6b-4f1d-9a1e-3b0f2c7d1a55",
"Content-Type": "application/json",
},
body: JSON.stringify({
api_mode: "atomic_single_post",
invoice_header: {
invoice_number: "RE-2026-0042",
invoice_date: "2026-08-06",
buyer_reference: "04011000-12345-34",
profile: "xrechnung",
},
validation_totals: { /* ... */ },
seller_snapshot: { /* ... */ },
buyer: { /* ... */ },
items: [ /* ... */ ],
}),
},
);
const invoice = await response.json(); using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer fa_live_...");
client.DefaultRequestHeaders.Add("Idempotency-Key", "8f14e45f-ea6b-4f1d-9a1e-3b0f2c7d1a55");
var payload = new
{
api_mode = "atomic_single_post",
invoice_header = new
{
invoice_number = "RE-2026-0042",
invoice_date = "2026-08-06",
buyer_reference = "04011000-12345-34",
profile = "xrechnung",
},
// validation_totals, seller_snapshot, buyer, items
};
var response = await client.PostAsJsonAsync(
"https://console.factora.software/api/v1/invoices/atomic/", payload);
var invoice = await response.Content.ReadFromJsonAsync<JsonElement>(); Valides XML ist nicht dasselbe wie richtige Steuer.
Reverse Charge mit 19 %, innergemeinschaftliche Lieferung ohne USt-IdNr., Befreiung ohne Grund — solche Kombinationen kommen bei Factora nicht als Dokument zurück, sondern als Fehler mit Regel-ID, Business Term und XPath. Die Befreiungsgründe nach BT-120 und BT-121 setzt die API selbst.
Ein Konto, ein Schlüssel, beliebig viele Endkunden.
Wer Branchensoftware betreibt, rechnet für seine Kunden ab, nicht für sich. Mandanten sind ein eigenes Objekt mit getrennten Stammdaten und eigenem Nummernkreis — die Rechnungsnummer bleibt bei dir, einen Factora-Nummernkreis gibt es nicht.
Der Steuerberater deines Kunden entscheidet mit.
Buchungsstapel mit 118 Spalten und Rechnungsdatensatz mit 12, CP1252 und deutschem Dezimalkomma. Dazu ein verschlüsseltes Archiv mit SHA-256-Nachweis und eine Übergabe als ZIP — damit dein Kunde seinen Bestand jederzeit vollständig herausbekommt.
Der Preis steht auf der Seite, nicht im Angebot.
49 € im Monat, 250 finalisierte Rechnungen inklusive, danach eine graduierte Staffel. Kein Verkaufsgespräch, kein Mindestvolumen, keine Preisstufe, die sich hinter einem Rate-Limit versteckt. Entwickelt wird Factora von Kay Dietrich — wenn eine Frage auftaucht, beantwortet er sie selbst, technisch und ohne Vertriebstermin.
Sandbox-Key holen und den ersten Request schicken.
Die Sandbox ist dauerhaft kostenlos, ohne Kreditkarte — teste den Atomic Endpoint mit echten Daten, bevor du irgendetwas entscheidest. Fragen zu Formaten, Volumen oder Mandantenstruktur klärst du danach direkt mit der Entwicklung.