Wir haben einen kleinen Job gebaut, der für jeden Shop in unserem System einmal die AGB liest und entscheidet, ob automatisierte Preisabrufe für Privatnutzer dort erlaubt sind. Das Feature ist heute live gegangen. Wir wollten gleich darüber schreiben — aber ehrlich: es funktioniert noch nicht. Erstmal nicht. Hier ist die Geschichte.
Warum wir damit überhaupt anfangen
Wenn du bei uns einen Tracker für einen Shop anlegst, läuft im Hintergrund schon länger ein Compliance-Check: wir holen die robots.txt der Domain und respektieren, was dort drin steht. Wenn ein Shop dort schreibt „bitte nicht crawlen”, lassen wir's. Das ist der maschinenlesbare Industry-Standard und in deutschem Recht eine recht klare Linie.
Was die robots.txt nicht abdeckt: das, was in den AGB eines Shops im Kleingedruckten zum Thema „automatisiertes Auslesen” steht. Manche Shops verbieten dort explizit Scraping, Bots, Crawler, oder auch nur „die automatische Vervielfältigung von Inhalten”. Andere haben dort gar nichts dazu stehen. Wieder andere erlauben es explizit für nicht-kommerzielle Nutzung.
Bisher war das bei uns ein blinder Fleck. Wir wollten ihn aufmachen — nicht weil ein Anwalt geklopft hat, sondern weil's der ehrlichere Umgang mit den Shops ist. Und weil ein Tracker, dessen Shop uns das Scraping ausdrücklich untersagt, ohnehin früher oder später entweder rechtlich oder technisch gegen die Wand fährt.
Was wir gebaut haben
Die Pipeline ist konzeptionell simpel:
- AGB-Link finden — wir holen die Startseite des Shops und scannen sie nach Footer-Links, die in einer von sechs Sprachen (Deutsch, Englisch, Französisch, Italienisch, Spanisch, Niederländisch) plausibel zu den AGB führen — Begriffe wie „AGB”, „Allgemeine Geschäftsbedingungen”, „Terms of Service”, „Conditions générales”. Off-Domain-Links akzeptieren wir nicht (wer seine AGB bei einer Anwaltskanzlei hostet, wird übersprungen — zu leicht zu fälschen)
- AGB-Text holen — wir laden die gefundene Seite, strippen Javascript, Styles und Navigation raus, lassen den reinen Vertragstext übrig
- LLM-Klassifikation — wir reichen den Text an ein kleines Sprachmodell weiter mit der Frage: „Erlauben diese AGB einem Privatnutzer den automatisierten Preisabruf zu nicht-kommerziellen Zwecken in niedriger Frequenz?” Antwort kommt zurück als
ALLOWED,DISALLOWEDoderUNCLEARplus einem Satz Begründung auf Deutsch - Persistenz — Ergebnis landet auf dem Shop-Eintrag in unserer Datenbank und erscheint am nächsten Morgen im Daily-Status-Report neben der robots.txt-Bewertung
Erwartetes Bild im Daily-Status, wenn alles läuft:
🆕 5 neue Shops (24h):
• example.de — ✓ robots ok — ✓ AGB ok — 3 Tracker
• shop.com — ✓ robots ok — 🚫 AGB verbietet Scraping — 1 Tracker
• mystery.io — ❓ robots ungeprüft — ❓ AGB nicht gefunden — 1 Tracker
Wo's hakt: die LLM-Inferenz
Wir wollten das bewusst lokal machen. Ein eigener kleiner Server, ein quelloffenes Modell (gemma4:e4b auf Ollama), keine Daten an OpenAI, Anthropic oder Google. Das ist eine Position die wir mögen — du sollst nicht ratraten müssen wo deine Anfragen verarbeitet werden. Wir auch nicht.
Die Box auf der das läuft, hat 12 GB RAM und keine GPU — bewusst klein gehalten. Beim ersten echten Test gegen einen normalen Shop (eine Shopify-AGB mit ~13 KB reinem Text) sieht das so aus:
- „Sag Hallo in einem Wort.” → 9 Sekunden ✓
- 4 KB AGB-Text mit Klassifikations-Prompt → Timeout nach 180 Sekunden ✗
- 40 KB AGB-Text mit Klassifikations-Prompt → Timeout nach 180 Sekunden ✗
Reines CPU-Inference braucht für so eine Klassifikation auf der kleinen Box mehrere Minuten pro Shop. Bei 20 Shops pro Tagesrun wären das im Worst Case eine knappe Stunde reine Inferenz-Zeit, die zuverlässig im 4-Uhr-Slot durchläuft — das geht so nicht.
Was funktioniert (und worauf wir jetzt aufbauen)
Die ersten beiden Pipeline-Schritte sitzen. Wir haben gegen drei zufällig gewählte Shops (cabletex.de, mediamarkt.de, thomann.de) getestet:
- cabletex.de →
/policies/terms-of-service✓ - mediamarkt.de →
/de/legal/terms✓ - thomann.de →
/compinfo_terms.html✓
Die AGB-URL wird also zuverlässig gefunden — das ist das in der Praxis fehleranfälligste Stück, weil jeder Shop seine Footer-Struktur anders baut. Auch die Persistenz, die Daily-Status-Anbindung und die tracking_status-Schraube, mit der wir disallowed-Shops später automatisch aus dem Scraping-Pool nehmen können, funktionieren technisch sauber.
Was fehlt, ist eine funktionierende Inferenz. Dafür gibt es drei realistische Optionen:
- Mehr Hardware — eine GPU im LXC-Container. Bringt die 120 Sekunden auf 2-5 Sekunden runter. Sauberste Lösung, kostet ein bisschen mehr Strom und nochmal Bastelei am Host.
- Hosted-API mit klarem Vertrag — Claude Haiku oder ein gleichwertig kleines Modell. 200 Millisekunden statt 120 Sekunden. Bei unserer Frequenz (~10 Calls pro Tag) liegen die Kosten unter zehn Cent im Monat. Heißt aber: der AGB-Text wird einmalig pro Shop an einen externen Provider geschickt. Kein Kundendatum, aber halt nicht mehr „komplett bei uns”.
- LLM weglassen, Stichwort-Heuristik — wenn im AGB-Text Begriffe wie „Scraping verboten”, „Crawler”, „automatisches Auslesen” auftauchen, markieren wir DISALLOWED, sonst ALLOWED. Sofort einsatzbereit, ungenau, viele Fehlklassifikationen bei Shops die diese Wörter im Kontext „Wir schützen uns vor…” verwenden.
Wir tendieren zu Option 2 als Übergangslösung — mit der ehrlichen Offenlegung dass es so läuft — und Option 1 als Endzustand, sobald die GPU verfügbar ist.
Was sich für dich heute ändert (Spoiler: wenig)
Konkret: nichts. Tracker laufen weiter wie bisher, der robots.txt-Check bleibt aktiv, Shops die uns über das Shop-Opt-out-Formular manuell ausgeschlossen haben bleiben ausgeschlossen. Der AGB-Check wird ab dem Zeitpunkt aktiv, an dem wir die Inferenz-Frage geklärt haben — und sobald er Ergebnisse liefert, siehst du sie im Daily-Status zusammen mit der robots.txt-Bewertung.
Wir hätten den Post auch erst nach der Lösung schreiben können — fertige Geschichte, alles glänzt. Stattdessen schreiben wir ihn jetzt, weil zwei Sachen daran wichtig sind: dass wir das überhaupt prüfen, und dass die ehrliche Antwort manchmal „funktioniert noch nicht, hier ist der Plan” ist.
Eine Bitte
Falls du als Shop-Betreiber das hier liest und eindeutige Regeln in deinen AGB hast — schreib uns eine kurze Mail an [email protected]. Die saubere Markierung von Hand ist immer besser als das, was unser Modell rät. Und falls du als Nutzer einen Shop kennst, von dem du sicher weißt dass er Scraping verbietet: gleicher Weg.
