Browser löst, Server entscheidet.
CAPTCHA einbinden: Anleitung für Entwickler.
Zwei Zeilen im Formular und ein POST von Ihrem Server. Der Client-Teil ist in einer Minute erledigt, der Server-Teil entscheidet, ob der Schutz überhaupt wirkt.
Stand: 1. August 2026
Alle gängigen CAPTCHA-Dienste folgen demselben Muster. Ein Script rendert ein Widget in einen Container, der Besucher löst die Prüfung, das Widget legt ein Ergebnis in das Formular, und Ihr Server fragt nach, ob dieses Ergebnis echt ist. Die Beispiele unten zeigen das an ByeBot, das Muster gilt auch für andere Anbieter.
Wie läuft die Prüfung technisch ab?
Der Browser löst, Ihr Server entscheidet.
Alles, was nur im Browser passiert, kann ein Bot überspringen. Deshalb ist der letzte Schritt der wichtige.
- Script-Tag lädt widget.js
- Container mit Sitekey
- Prüfung im Browser gelöst
- Feld byebot-token gesetzt
Ihr Server
POST /validate_token
HTTP 200
- Prüfung gültig
- Formular annehmen
HTTP 400
- Ungültig oder verbraucht
- Formular ablehnen
Das Widget prüft im Browser, angenommen oder abgelehnt wird das Formular ausschließlich auf Ihrem Server.
Schritt 1: Wie binde ich das Widget ein?
Ein Script-Tag und ein Container mit dem Sitekey.
<script src="https://challenge.byebot.de/ray/widget.js" defer></script>
<form action="/kontakt" method="post">
<input name="email" type="email" required>
<textarea name="nachricht" required></textarea>
<div class="captcha-widget" data-sitekey="IHR_SITEKEY"></div>
<button type="submit">Absenden</button>
</form>
Echte Aufnahme des laufenden Dashboards. Die Werte stammen aus einem Testkonto mit Demo-Daten.
- Container
- Das Widget rendert sich in jedes Element mit der Klasse captcha-widget.
- Sitekey
- Öffentlich und an die Domains gebunden, die Sie im Dashboard eingetragen haben. Auf fremden Domains rendert das Widget nicht.
- Ergebnis
- Nach erfolgreicher Prüfung legt das Widget im umschließenden Formular ein verstecktes Feld namens byebot-token ab.
- Build
- Kein Build-Schritt, keine Bibliothek, kein Framework nötig.
Schritt 2: Wie prüfe ich das Ergebnis auf dem Server?
Mit einer POST-Anfrage, bevor Sie das Formular annehmen.
POST https://challenge.byebot.de/validate_token
Content-Type: application/json
{
"api_key": "IHR_API_KEY",
"token": "Wert des Feldes byebot-token"
}200Prüfung gültig. Formular annehmen.400Prüfung ungültig. Formular ablehnen.
// Node.js / Express
const antwort = await fetch("https://challenge.byebot.de/validate_token", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
api_key: process.env.BYEBOT_API_KEY,
token: req.body["byebot-token"],
}),
});
if (!antwort.ok) {
return res.status(400).send("CAPTCHA-Prüfung fehlgeschlagen");
}
// ab hier das Formular verarbeiten- Erfolg
- Antwort 200 mit einem JSON-Objekt, das unter anderem success, sitekey, challenged_at, solve_time_ms und interactive_solved enthält.
- Fehlschlag
- Antwort 400. Ein bereits eingelöstes Ergebnis wird abgelehnt, ein zweites Einreichen desselben Wertes also ebenfalls.
- API-Schlüssel
- Bleibt auf dem Server, in einer Umgebungsvariablen. Niemals im ausgelieferten Frontend.
Schritt 3: Wie integriere ich das in mein Framework?
Gleiches Muster, andere Syntax.
- React, Next.js
- Container als Komponente, Render-Aufruf nach dem Mount.
- Vue, Angular, Svelte
- Dieselbe Logik im jeweiligen Lifecycle-Hook.
- Express, Django, Go, Rails, Rust
- Die Prüfung als Middleware oder direkt im Formular-Handler.
- WordPress
- Per Plugin, ohne eigenen Code.
- Native Apps
- SDKs für React Native, Android und iOS. Das Widget läuft dort in einer WebView.
In Anwendungen, die das Formular erst nachträglich in den DOM hängen, stoßen Sie das Rendern selbst an:
// Wenn das Formular erst nachträglich in den DOM kommt
window.Byebot.render(element); // ein einzelner Container
window.Byebot.renderAll(); // alle Container auf der SeiteVollständige Beispiele für über zehn Frameworks stehen in der ByeBot-Dokumentation.
Welche Fehler kosten den Schutz?
Vier, und der erste macht das Widget wirkungslos.
Hält
Wirksam eingebunden
- Serverseitige Prüfung vor der Annahme
- API-Schlüssel in einer Umgebungsvariablen
- Domain im Dashboard eingetragen
- Fehlerfall mit Meldung und neuem Versuch
Fällt durch
Sieht nur richtig aus
- Nur im Browser geprüft
- API-Schlüssel im Frontend
- Entwicklungs-Domain fehlt
- Formular wird stumm verworfen
Die rechte Spalte beschreibt Einbindungen, die im Browser korrekt aussehen und trotzdem nichts abhalten.
- Nur im Browser
- Ein Bot schickt das Formular direkt per HTTP-Anfrage ab und sieht das Widget nie. Ohne die Prüfung auf dem Server ist der Schutz Dekoration.
- Schlüssel sichtbar
- Im ausgelieferten Frontend ist der API-Schlüssel für jeden lesbar und damit für jeden nutzbar.
- Domain fehlt
- Das Widget rendert nur auf hinterlegten Domains. Für lokale Entwicklung braucht es einen eigenen Eintrag oder einen Test-Sitekey.
- Stummer Fehler
- Bei einer fehlgeschlagenen Prüfung braucht der Besucher eine verständliche Meldung und einen zweiten Versuch.
Fragen zur Einbindung.
Kurze Antworten zu Antwortcodes, Schlüsseln, Domains, Rendern und nativen Apps.
Was passiert, wenn dasselbe Ergebnis zweimal eingereicht wird?
Der Validierungsendpunkt lehnt es ab. Ein bereits eingelöstes Ergebnis wird abgelehnt, ein zweites Einreichen desselben Wertes also ebenfalls. Die Antwort ist dann 400 und das Formular wird abgelehnt. Bei Erfolg antwortet der Endpunkt mit 200 und einem JSON-Objekt, das unter anderem success, sitekey, challenged_at, solve_time_ms und interactive_solved enthält.
Wohin gehört der API-Schlüssel?
Er bleibt auf dem Server, in einer Umgebungsvariablen, niemals im ausgelieferten Frontend. Dort ist er für jeden lesbar und damit für jeden nutzbar. Öffentlich ist nur der Sitekey. Er ist an die Domains gebunden, die Sie im Dashboard eingetragen haben, und auf fremden Domains rendert das Widget nicht.
Warum bleibt der Container in der lokalen Entwicklung leer?
Das Widget rendert nur auf hinterlegten Domains. Für lokale Entwicklung braucht es einen eigenen Eintrag oder einen Test-Sitekey. Die fehlende Entwicklungs-Domain steht in der Gegenüberstellung auf dieser Seite in der Spalte, die im Browser korrekt aussieht und trotzdem nichts abhält.
Braucht die Einbindung einen Build-Schritt?
Nein. Kein Build-Schritt, keine Bibliothek, kein Framework nötig. Das Widget rendert sich in jedes Element mit der Klasse captcha-widget. In Anwendungen, die das Formular erst nachträglich in den DOM hängen, stoßen Sie das Rendern selbst an: window.Byebot.render für einen einzelnen Container, window.Byebot.renderAll für alle Container auf der Seite.
Was gehört in die Fehlerbehandlung, wenn eine Prüfung fehlschlägt?
Bei einer fehlgeschlagenen Prüfung braucht der Besucher eine verständliche Meldung und einen zweiten Versuch. Ein Formular, das stumm verworfen wird, gehört auf dieser Seite zu den vier Fehlern, die im Browser korrekt aussehen.
Läuft das Widget in einer nativen App?
Ja, über SDKs für React Native, Android und iOS. Das Widget läuft dort in einer WebView. Im Web ist das Muster framework-unabhängig: ein Container im Markup, ein POST im Backend. Vollständige Beispiele für über zehn Frameworks stehen in der ByeBot-Dokumentation, von React und Vue bis WordPress.
Sieben Tage testen, dann entscheiden.
Ein Zahlungsmittel wird zu Beginn hinterlegt. In der Testphase liegt die Grenze bei 10.000 Prüfungen. Danach ab 19 € im Monat.