🐍 Python · requests · multipart/form-data

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
}
kategorie — Steuerliche Kategorie des Belegs (z.B. Arbeitsmittel, Reisekosten)
absetzbar — Ob der Beleg generell absetzbar ist
grund — Rechtliche Begründung mit Paragraphenangabe
credits_remaining — Verbleibende Credits im Konto

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 None
401Ungültiger API-Schlüssel — prüfen Sie den Schlüssel im Dashboard
403Keine Credits mehr — bitte Credits kaufen
TimeoutZeitüberschreitung — bei großen Dateien erhöhen Sie den timeout-Wert

Hä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.