Rechnungen mit Python automatisch analysieren
Die Steuerscan API lässt sich mit wenigen Zeilen Python einbinden. Rechnungen und Belege automatisch auf steuerliche Absetzbarkeit prüfen — DSGVO-konform auf EU-Servern, 1 Credit pro Analyse.
Zuletzt aktualisiert: 17. März 2026
1. Installation
Die Steuerscan API benötigt nur das requests-Paket. Keine weiteren Abhängigkeiten erforderlich.
pip install requests
2. API-Schlüssel
Registrieren Sie sich bei Steuerscan (5 Credits gratis) und erstellen Sie unter Dashboard → API-Schlüssel einen neuen Schlüssel. Für die Entwicklung empfehlen wir einen Test-Schlüssel — dieser verbraucht keine Credits und gibt statische Beispieldaten zurück.
Test-Schlüssel
sk_test_...Kostenlos · Statische Beispieldaten · Endpoint: /api/v1/test/process
Live-Schlüssel
sk_live_...1 Credit / Analyse · Echte KI-Analyse · Endpoint: /api/v1/process
3. Einfaches Beispiel
Eine einzelne Rechnung analysieren und Kategorie, Absetzbarkeit und Begründung ausgeben:
import requests
API_KEY = "sk_live_IHR_SCHLÜSSEL" # oder sk_test_... zum Testen
API_URL = "https://api.steuerscan.de/api/v1/process"
# Zum Testen: API_URL = "https://api.steuerscan.de/api/v1/test/process"
def analyse_rechnung(dateipfad: str, beruf: str = "") -> dict:
with open(dateipfad, "rb") as f:
response = requests.post(
API_URL,
headers={"X-API-Key": API_KEY},
files={"file": f},
data={"job_description": beruf} if beruf else {},
)
response.raise_for_status()
return response.json()
ergebnis = analyse_rechnung("rechnung.pdf", beruf="Software Developer")
results = ergebnis["results"]
print(f"Kategorie: {results['kategorie']}")
print(f"Absetzbar: {results['absetzbar']}")
print(f"Begründung: {results['grund']}")
print(f"Credits: {ergebnis['credits_remaining']} verbleibend")4. Antwort-Struktur
Die API gibt ein JSON-Objekt zurück. Die Werte für absetzbar und absetzbar_fuer_bestimmte_berufe sind Python-kompatible Booleans (True / False):
{
"results": {
"kategorie": "Arbeitsmittel",
"absetzbar": True,
"absetzbar_fuer_bestimmte_berufe": False,
"grund": "Der Laptop ist als Arbeitsmittel nach §9 EStG...",
"bedingungen": [],
"hinweise": ["Geringwertige Wirtschaftsgüter bis 800€ netto sofort absetzbar"]
},
"credits_remaining": 42
}5. Batch-Verarbeitung (ganzer Ordner)
Alle PDFs in einem Ordner analysieren und die Ergebnisse als CSV speichern. Eine kurze Pause zwischen den Anfragen schont die API und gibt der KI Zeit zur Verarbeitung:
import csv
import time
from pathlib import Path
import requests
API_KEY = "sk_live_IHR_SCHLÜSSEL"
API_URL = "https://api.steuerscan.de/api/v1/process"
def batch_analyse(ordner: str, ausgabe_csv: str, beruf: str = ""):
rechnungen = list(Path(ordner).glob("*.pdf"))
print(f"{len(rechnungen)} PDFs gefunden.")
with open(ausgabe_csv, "w", newline="", encoding="utf-8") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["Datei", "Kategorie", "Absetzbar", "Begründung"])
for pfad in rechnungen:
try:
with open(pfad, "rb") as f:
response = requests.post(
API_URL,
headers={"X-API-Key": API_KEY},
files={"file": f},
data={"job_description": beruf} if beruf else {},
timeout=30,
)
response.raise_for_status()
r = response.json()["results"]
writer.writerow([pfad.name, r["kategorie"], r["absetzbar"], r["grund"]])
print(f"✓ {pfad.name}: {r['kategorie']} — {'absetzbar' if r['absetzbar'] else 'nicht absetzbar'}")
time.sleep(0.5)
except Exception as e:
writer.writerow([pfad.name, "FEHLER", "", str(e)])
print(f"✗ {pfad.name}: {e}")
batch_analyse("./rechnungen", "ergebnisse.csv", beruf="Freiberuflicher Berater")6. Fehlerbehandlung
Produktionsreife Fehlerbehandlung für die häufigsten Fehlerszenarien:
import requests
def analyse_mit_fehlerbehandlung(dateipfad: str) -> dict | None:
try:
with open(dateipfad, "rb") as f:
response = requests.post(
"https://api.steuerscan.de/api/v1/process",
headers={"X-API-Key": API_KEY},
files={"file": f},
timeout=30,
)
if response.status_code == 401:
print("Fehler: Ungültiger API-Schlüssel.")
return None
if response.status_code == 403:
print("Fehler: Keine Credits mehr. Bitte Credits kaufen.")
return None
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout:
print("Fehler: Zeitüberschreitung. Bitte erneut versuchen.")
return None
except requests.exceptions.RequestException as e:
print(f"Netzwerkfehler: {e}")
return NoneHäufige Fragen
Welche Python-Version wird benötigt?
Python 3.7 oder neuer. Das requests-Paket unterstützt alle aktuellen Python-Versionen.
Gibt es ein offizielles Python-SDK?
Nein, aber die API ist so einfach, dass das requests-Paket vollständig ausreicht.
Wie viele Anfragen kann ich gleichzeitig senden?
Für Batch-Verarbeitung empfehlen wir maximal 5 parallele Anfragen und eine kurze Pause (time.sleep(0.5)) zwischen Anfragen. Jede Anfrage verbraucht 1 Credit.
Jetzt kostenlos starten
Registrieren Sie sich, erhalten Sie 5 Credits gratis und analysieren Sie Ihre ersten Rechnungen in wenigen Minuten.