Wenn der eigene Bot-Schutz dich aussperrt
Was wir in einem Nachmittag mit Vercel BotID gelernt haben — inklusive dem Moment, an dem unser eigenes Smoke-Test-Script 403'te.
Es ist eine eigentümliche Form von Validierung, wenn dein eigener Bot-Schutz dir den Zutritt verweigert. Heute Nachmittag haben wir Vercel BotID nicht nur eingeführt, sondern in einem ungeplanten Live-Drill auch gleich getestet — gegen uns selbst.
Was wir geshipt haben
Drei Routen sind ab sofort BotID-gated:
POST /api/contact— KontaktformularPOST /api/newsletter— Newsletter-SignupPOST /api/chat— der AI-Chat-Endpoint, jeder Call ist ein billable Gateway-Aufruf
Plus <BotIdClient protect={...}> im Root-Layout, damit der Client tatsächlich Interaktions-Signale (Maus, Tastatur, Scroll) auf Outbound-Requests anhängt. Ohne diese Komponente fällt das System auf reine Server-Detection zurück (UA + Header) — gut gegen primitives, leicht zu umgehen von headless Chrome.
Der Plot-Twist
Nach dem Deploy wollten wir verifizieren, dass die neuen Changelog-Einträge live sind. Klassisches Smoke-Test-Skript:
node -e "fetch('https://nex-soft.com/changelog').then(r => r.text()).then(html => console.log(html.includes('8. Snapshot')))"
Antwort:
403 — x-vercel-mitigated: challenge
Unser eigenes Verifikations-Script wurde von unserem eigenen Bot-Schutz blockiert. Sekundenlanges Stutzen. Dann: laute Freude. Das ist genau das, was wir gebaut haben.
Warum das die richtige Reaktion ist
Vercel Firewall + BotID unterscheidet nicht zwischen „böser Bot" und „mein eigenes Smoke-Test-Skript". Aus Sicht der Detection-Engine sehen beide gleich aus: kein Browser, keine Maus-Bewegung, keine BotIdClient-Signale, hohe Request-Frequenz von derselben IP über kurze Zeit. Genau dieses Signal-Set wollen wir blockieren.
Die Alternative wäre, eine Whitelist-Mechanik einzuziehen („dieser Token gehört zum Owner-Team, lass durch"). Die hat aber denselben Schwachpunkt wie jedes Whitelist-System: jemand klaut den Token, schon ist die Whitelist ein Backdoor.
Die echte Lektion: Verifikations-Layer trennen
Wenn Production-Traffic strikt geschützt ist, brauchst du einen separaten Verifikations-Pfad. Drei Optionen:
- Per Vercel CLI inspizieren:
npx vercel inspect https://nex-soft.comzeigt direkt welcher Deployment hinter dem Alias hängt, ohne den Edge-Layer zu hitten. Das nutzen wir jetzt für Deploy-Verifikation. - Lighthouse via echtem Chrome: Headless Chrome lädt das ganze Page incl. BotIdClient-Script und sieht aus wie ein echter Browser. Unsere
npm run audit:lighthousePipeline funktioniert deshalb völlig normal weiter — die Audits passieren. - Bypass-Token für CI: BotID kennt das Konzept eines „bypass token", den du in Server-zu-Server-Aufrufen mitschicken kannst. Für interne Cron-Jobs oder CI-Smoke-Tests die saubere Lösung.
Wir machen aktuell Variante (1) + (2). Variante (3) kommt sobald wir CI haben.
Was wir nicht erwartet hätten
Die Firewall lernt offenbar dazu. Frühere Smoke-Tests im selben Session-Verlauf gingen durch. Erst nach ~20 Requests in 30 Minuten begann die Mitigation zu greifen. Das ist ein Feature, kein Bug — Rate-basierte Detection braucht ein bisschen Signal-Sammeln, bevor sie konfident genug ist zu blockieren.
Für eine Marketing-Site mit drei POST-Endpoints ist das Verhalten gold wert: kein menschlicher User wird je in diese Schwelle reinlaufen, aber jeder Scraper schon nach wenigen Versuchen.
Was es kostet
Praktisch nichts. <BotIdClient> ist ein ~10kb Script, lazy-loaded, das auf protected paths Signale anhängt. Server-side ist checkBotId() ein millisecond-call. Vercel-Pricing: free tier reicht für die meisten kleinen Sites; das billable cap kicked erst bei wirklich hohem Volume.
Verglichen mit der Alternative — ein bot drained dein AI-Gateway-Budget über Nacht um €200 — ist das ein No-Brainer.
TL;DR
- BotID + Firewall auf teuren POST-Endpoints (besonders AI) ist Pflicht-Hygiene 2026.
- Wenn dein eigenes Test-Skript geblockt wird: Glückwunsch, es funktioniert.
- Plane einen separaten Verifikations-Pfad (CLI / Lighthouse / Bypass-Token) bevor du es brauchst.
- Production Defense ist nicht: „lass alles durch was nicht eindeutig böse aussieht". Production Defense ist: „lass nur durch was eindeutig menschlich aussieht."
Wenn du gerade dein erstes AI-Feature in Production schiebst und überlegst „brauch ich BotID?": Ja. Bevor du es brauchst, nicht danach.
Neue Insights direkt im Postfach
Ehrliche Notes aus Engineering, AI und echten Cases. Etwa 1× im Monat, jederzeit abbestellbar.
Hilft das deinem Vorhaben weiter?
Lass uns 30 Min sprechen — konkret zu deinem Case.
Auch lesenswert
Fluid Compute statt Edge Functions
Wir haben drei Projekte komplett von Edge Functions auf Fluid Compute migriert. Hier sind die fünf Sachen, die uns positiv überrascht haben — und die zwei Edge-Cases, in denen wir trotzdem bei der alten Runtime bleiben.
BotID gegen AI-Budget-Abuse
Ein öffentlicher /api/chat-Endpoint ohne Bot-Schutz ist eine Visa-Karte mit PIN draußen. Hier ist, wie wir Vercel BotID vor unseren AI-Chat gesetzt haben — invisible für echte User, 429 für Bots, gerettetes AI-Gateway-Budget.
Kein Funnel, kein Sales-Rep. Du redest mit mir.
Ich höre dir 30 Minuten zu, stelle ein paar gezielte Fragen und sage dir am Ende ehrlich, ob — und wie — wir dir helfen können. Wenn nicht, bekommst du mindestens zwei Empfehlungen, wer's könnte.
- 30 Min, kein Sales-Pitch
- Konkrete Einschätzung deines Cases
- Fixpreis-Indikation am Ende des Calls