API-Integrationsleitfaden — Rechnungsstellung, CRM & Buchhaltung automatisieren
docs101 stellt seine gesamte Funktionalität als REST API bereit und ermöglicht Entwicklern, Rechnungserstellung, Kundenverwaltung und Buchhaltungsexporte aus jeder Sprache oder Plattform heraus zu automatisieren. Jede über die API erstellte Rechnung ist automatisch EU-konform — ZUGFeRD- und XRechnung-XML wird in die PDF eingebettet, ohne dass Sie sich um XML-Schemata oder PDF/A-Konvertierung kümmern müssen. Ob Sie eine SaaS-Abrechnungspipeline aufbauen, Ihr CRM synchronisieren oder DATEV-Exporte an Ihren Steuerberater liefern — die API deckt alles ab. Dieser Leitfaden beschreibt, was die API kann. Eine praktische Schritt-für-Schritt-Anleitung finden Sie im Tutorial.
Der API-Zugang erfordert ein aktives Pro-Abonnement. Unter Schnellstart erfahren Sie, wie Sie Ihren ersten API-Schlüssel erstellen.
Was Sie damit bauen können
Die docs101 API ist für Entwickler konzipiert, die Rechnungsstellung in bestehende Systeme integrieren möchten. Hier einige typische Anwendungsfälle:
- SaaS-Abrechnungsautomatisierung — Rechnungserstellung aus Ihrem Abosystem anstoßen, wenn ein Abrechnungszyklus abgeschlossen ist
- ERP-/CRM-Synchronisation — Kunden und Rechnungen aus Ihrem CRM anlegen und beide Systeme synchron halten
- Agentur-Rechnungsstellung — Zeiterfassungsdaten (z. B. aus Clockify) importieren und automatisch Kundenrechnungen erstellen
- Buchhaltungspipeline — Nächtliche DATEV-Exporte planen, um den Workflow Ihres Steuerberaters zu bedienen
- White-Label-Rechnungsstellung — docs101 als Rechnungsengine hinter Ihrem eigenen Produkt nutzen
So funktioniert es
Alle API-Anfragen werden über einen X-API-Key-Header authentifiziert und liefern JSON-Antworten. PDF-Generierung und Buchhaltungsexporte laufen asynchron — Sie starten einen Job und fragen dessen Status ab, bis er abgeschlossen ist. Die Basis-URL für alle Endpunkte ist https://docs101.com/api/v1.
Rechnungsstellung — EU-konforme Rechnungen erstellen
Der Rechnungslebenszyklus folgt einem klaren Ablauf: Entwurf erstellen, Positionen hinzufügen, Rechnung über einen asynchronen Job finalisieren und die fertige PDF herunterladen. Die generierte PDF ist ZUGFeRD/XRechnung-konform mit eingebettetem XML — keine zusätzlichen Schritte nötig. Sie können Rechnungen auch direkt über die API per E-Mail versenden.
| Aktion | Methode | Endpunkt | Hinweise |
|---|---|---|---|
| Rechnungen auflisten | GET | /invoice/ | Paginiert, filterbar |
| Rechnung erstellen | POST | /invoice/ | Gibt { "invoice_id": ... } zurück |
| Rechnung abrufen | GET | /invoice/{id} | Vollständiges Rechnungsobjekt |
| Rechnung aktualisieren | PUT | /invoice/{id} | Nur im Status Draft |
| Position hinzufügen | POST | /invoice/{id}/positions | Positionen mit Menge, Preis, Steuer |
| Positionen umsortieren | PUT | /invoice/{id}/positions/reorder | Array von Positions-IDs |
| Validieren | GET | /invoice/{id}/validate | Vorabprüfung mit USt-IdNr.-Validierung |
| Finalisieren (async) | POST | /invoice/{id}/job | PDF-Generierungsjob einreihen |
| Job-Status abfragen | GET | /invoice/{id}/job/{job_id} | Gibt queued / started / finished / failed zurück |
| PDF herunterladen | GET | /invoice/{id}/pdf-link | Presigned S3-URL |
| XML herunterladen | GET | /invoice/{id}/xml-link | ZUGFeRD/XRechnung-XML |
| E-Mail senden | POST | /invoice/{id}/send_email | Mit optionalem BCC und Anhängen |
| Als versendet markieren | PUT | /invoice/{id}/status | { "status": "SENT" } |
| Als bezahlt markieren | PUT | /invoice/{id}/status | { "status": "PAID", "paid_date": "...", "payment_method": "..." } |
| Rechnung stornieren | POST | /invoice/{id}/cancel | Irreversibel |
| Gutschrift erstellen | POST | /invoice/{id}/credit-note | Aus bestehender Rechnung |
| Anhänge verwalten | GET / POST | /invoice/{id}/attachments | PDF, DOCX, XLSX, Bilder (5 MB Limit) |
| PDF-Vorschau | GET | /invoice/{id}/preview | Entwurfsvorschau ohne Finalisierung |
# Create an invoice
invoice = requests.post(f"{BASE_URL}/invoice/", headers=HEADERS, json={
"customer_id": 42,
"ftl_template_id": 1,
"invoice_date": "2025-03-15",
"tax_treatment_id": "standard",
}).json()
# Add a line item
requests.post(f"{BASE_URL}/invoice/{invoice['invoice_id']}/positions", headers=HEADERS, json={
"description": "Consulting — March 2025",
"quantity": 10,
"unit_price": 150.00,
"tax_rate": 0.19,
"unit_id": 5,
})
Die Finalisierung läuft asynchron. Nach POST /invoice/{id}/job fragen Sie die zurückgegebene job_id ab, bis der Status finished ist. Das Schritt-für-Schritt-Tutorial zeigt das vollständige Polling-Muster.
CRM — Kunden, Adressen & USt-IdNr. verwalten
docs101 unterstützt sowohl B2B- als auch B2C-Kunden. Bei B2B-Kunden kann die EU-USt-IdNr. automatisch gegen die VIES-Datenbank validiert werden. Jeder Kunde kann mehrere Adressen haben (Rechnungs- und Lieferadresse), und Sie können Kontoauszüge als PDF generieren.
| Aktion | Methode | Endpunkt | Hinweise |
|---|---|---|---|
| Kunden auflisten | GET | /customer/ | Paginiert, Suche, E-Mail-Lookup |
| Kunde erstellen | POST | /customer/ | Gibt { "id": ... } zurück |
| Kunde abrufen | GET | /customer/{id} | Vollständiges Kundenobjekt |
| Kunde aktualisieren | PUT | /customer/{id} | |
| Adressen verwalten | GET / POST | /customer/{id}/addresses | Rechnungs-, Lieferadresse |
| USt-IdNr. validieren | GET | /customer/{id}/vat-check | Asynchrone VIES-Validierung |
| Finanzübersicht | GET | /customer/{id}/financial-overview | Offene/bezahlte Summen |
| Kontoauszug | GET | /customer/{id}/statement | JSON-Daten mit Zeitraumfilter |
| Kontoauszug-PDF | GET | /customer/{id}/statement/pdf | Presigned Download-URL |
# Create a B2B customer
customer = requests.post(f"{BASE_URL}/customer/", headers=HEADERS, json={
"organization_name": "Acme GmbH",
"email": "billing@acme.de",
"vat_id": "DE123456789",
"contact_type": "B2B",
}).json()
# Add a billing address
requests.post(
f"{BASE_URL}/customer/{customer['id']}/addresses",
headers=HEADERS,
json={
"address_line_1": "Musterstraße 1",
"postal_code": "10115",
"city": "Berlin",
"country_code": "DE",
"type": "billing",
},
)
Wenn Sie einen B2B-Kunden mit einer vat_id anlegen, validiert docs101 diese automatisch gegen die EU-VIES-Datenbank. Falls die Nummer nicht bestätigt werden kann, fordert der Finalisierungsschritt eine explizite Bestätigung mit vat_override_confirmed: true.
Buchhaltung — DATEV-Export & Download-Verwaltung
docs101 kann Rechnungen im DATEV-Format für deutsche Steuerberater exportieren. Der Export ist konfigurierbar — Sie definieren Sachkontozuordnungen für Ihre Erlöskonten — und läuft asynchron. Exporte, die mehrere Kalenderjahre umfassen, werden automatisch in separate Dateien aufgeteilt. Alle Exportdateien stehen als ZIP-Downloads über Presigned URLs zur Verfügung.
| Aktion | Methode | Endpunkt | Hinweise |
|---|---|---|---|
| DATEV-Export auslösen | POST | /exports/job | { "task": "process_datev_export_job", ... } |
| Exportstatus abfragen | GET | /exports/job/{job_id} | Status + result-Objekt bei Abschluss |
| DATEV-Konfiguration abrufen | GET | /datev/config | Unternehmensweite Exporteinstellungen |
| DATEV-Konfiguration aktualisieren | PUT | /datev/config | |
| Kontozuordnungen abrufen | GET | /datev/mappings | Sachkontozuordnungen |
| Zuordnungen aktualisieren | PUT | /datev/mappings | Batch-Speicherung |
| Zuordnungen zurücksetzen | POST | /datev/mappings/reset | Standardwerte wiederherstellen |
| Downloads auflisten | GET | /downloads/ | Alle verfügbaren Exportdateien |
| Datei herunterladen | GET | /downloads/{id}/download | Presigned S3-URL |
| Download löschen | DELETE | /downloads/{id} | Exporteintrag entfernen |
# Trigger a DATEV export
job = requests.post(f"{BASE_URL}/exports/job", headers=HEADERS, json={
"task": "process_datev_export_job",
"start_date": "2025-01-01",
"end_date": "2025-03-31",
}).json()
# Poll until finished
import time
while True:
status = requests.get(
f"{BASE_URL}/exports/job/{job['job_id']}", headers=HEADERS
).json()
if status["status"] == "finished":
break
time.sleep(2)
# Download all export files
for download_id in status["result"]["download_ids"]:
dl = requests.get(
f"{BASE_URL}/downloads/{download_id}/download", headers=HEADERS
).json()
print(f"Download: {dl['url']}")
Wenn Ihr Exportzeitraum mehrere Kalenderjahre umfasst, teilt docs101 den Export automatisch in separate Dateien pro Jahr auf. Das result-Objekt enthält dann is_split: true und ein split_reason-Feld mit der Begründung.
Manuell vs. API — im Vergleich
| Aufgabe | In der Web-App | Per API |
|---|---|---|
| Kunde anlegen | Formular ausfüllen, Speichern klicken | POST /customer/ mit JSON-Body |
| Rechnung erstellen | Kunde auswählen, Positionen ausfüllen, Erstellen klicken | POST /invoice/ → POST .../positions |
| PDF generieren | Finalisieren klicken | POST .../job → abfragen → GET .../pdf-link |
| Per E-Mail senden | Senden klicken, Empfänger eingeben | POST .../send_email mit Empfänger im Body |
| Nach DATEV exportieren | Seite Exporte → Exportieren klicken | POST /exports/job → abfragen → GET .../download |
| USt-IdNr. prüfen | Automatisch beim Speichern des Kunden | GET /customer/{id}/vat-check |
Alles, was Sie in der Web-App tun können, können Sie auch per API erledigen — und automatisieren.
Über die Rechnungsstellung hinaus
Die API deckt auch weitere Bereiche von docs101 ab:
- Vorlagen — Rechnungsvorlagen auflisten, konfigurieren und in der Vorschau anzeigen (
/template/) - Produkte — Produktkatalog für schnelle Positionseingabe verwalten (
/products/) - Unternehmenseinstellungen — Firmendaten, Logo, Bankverbindungen, Zahlungsbedingungen aktualisieren (
/company/) - Rechnungsnummern — Nummerierungssequenzen mit Datumsplatzhaltern konfigurieren (
/numbering/) - Teamverwaltung — Mitglieder einladen, Rollen verwalten (
/members/) - Audit-Log — Alle Änderungen für Compliance nachverfolgen (
/audit-log/)
Loslegen
- Schnellstart — Erstellen Sie Ihren ersten API-Schlüssel und senden Sie eine Testanfrage in 5 Minuten
- Schritt-für-Schritt-Tutorial — Vollständige Anleitung von der Kundenanlage bis zum DATEV-Export
- Python SDK — Offizielle Python-Clientbibliothek für die docs101 API
- Swagger UI — Interaktive API-Referenz mit allen Endpunkten und Schemata