Stoppen Sie Bots.
Ohne dass Ihre
Nutzer es merken.
Eine Checkbox. Null API-Keys. Null Tracking. Ihre Nutzer haken ab und gehen weiter. Bots prallen an einer kryptografischen Mauer ab, die Ihr Server in einer einzigen Codezeile validiert.
Unsichtbar für Menschen.
Unmöglich für Bots.
Drei Schritte. Kein einziger mehr. Keine vorab geladenen Bibliotheken, keine Drittanbieter-Skripte, keine Schlüssel zum Rotieren.
Nutzer aktiviert eine Checkbox
Bis zu diesem Klick schläft mCaptcha. Kein Fetch, kein CPU-Zyklus, keine DNS-Anfrage. Ihr Lighthouse-Score bemerkt es nicht einmal.
Krypto-Challenge in ~50 ms
Der Browser löst einen SHA-256 Proof-of-Work. Bei >30 Challenges pro Stunde von einer IP wechseln wir zu einem Slider-Puzzle, das kein Bot ohne echte menschliche Zeit überwindet.
Ihr Backend bekommt ein Token
Ein GET an /api/captcha/verify mit dem Token. Wenn ok=true, ist es ein Mensch und Sie verarbeiten das Formular. Einmal-Nutzung, 2 Minuten gültig. Eine Zeile in jeder Sprache.
Gleiches Ziel.
Bessere Konsequenzen.
Alles, was reCAPTCHA für Sie tut, tut mCaptcha auch. Was reCAPTCHA Ihren Nutzern antut, nicht.
Zwei Zeilen. Fertig.
Kein npm install. Kein Dashboard zum Registrieren. Keine Keys zum Kopieren. Snippet einfügen, deployen, Ticket schließen.
<form action="/contact" method="POST">
<input name="email" required>
<textarea name="message" required></textarea>
<div class="mcaptcha"></div>
<button type="submit">Senden</button>
</form>
<script src="https://medel.es/captcha.js" async defer></script>
Bevor Sie das Formular verarbeiten,
validieren Sie das Token.
Ihr Backend empfängt mcaptcha_token. Macht ein GET, prüft ok=true, weiter. Fünf Sprachen, ein Flow, null Bibliotheken zu installieren.
<?php
function mcaptcha($token) {
$url = 'https://medel.es/api/captcha/verify?token=' . urlencode($token);
$response = json_decode(file_get_contents($url));
return $response->ok ?? false;
}
// Verwendung:
$token = $_POST['mcaptcha_token'] ?? '';
if (!mcaptcha($token)) {
http_response_code(400);
exit('Captcha fehlgeschlagen');
}
// ✅ Captcha verifiziert. Formular verarbeiten.
// Client-seitige Validierung — nützlich in SPAs vor dem Senden ans Backend.
// Für echten Schutz IMMER auch serverseitig verifizieren.
async function mcaptcha(token) {
const url = 'https://medel.es/api/captcha/verify?token=' + encodeURIComponent(token);
const data = await fetch(url).then(r => r.json());
return data.ok === true;
}
// Verwendung in einem Formular:
document.querySelector('form').addEventListener('submit', async (e) => {
e.preventDefault();
const fd = new FormData(e.target);
const token = fd.get('mcaptcha_token');
if (!(await mcaptcha(token))) {
alert('Captcha fehlgeschlagen');
return;
}
// ✅ Captcha verifiziert. An Backend senden.
await fetch('/api/contact', { method: 'POST', body: fd });
});
async function mcaptcha(token) {
const url = 'https://medel.es/api/captcha/verify?token=' + encodeURIComponent(token);
const data = await fetch(url).then(r => r.json());
return data.ok === true;
}
// Verwendung (Express):
const token = req.body.mcaptcha_token;
if (!(await mcaptcha(token))) {
return res.status(400).send('Captcha fehlgeschlagen');
}
// ✅ Captcha verifiziert. Formular verarbeiten.
import urllib.request, urllib.parse, json
def mcaptcha(token):
url = 'https://medel.es/api/captcha/verify?' + urllib.parse.urlencode({'token': token})
with urllib.request.urlopen(url, timeout=5) as r:
return json.loads(r.read()).get('ok') is True
# Verwendung (Flask):
token = request.form.get('mcaptcha_token', '')
if not mcaptcha(token):
abort(400, 'Captcha fehlgeschlagen')
# ✅ Captcha verifiziert. Formular verarbeiten.
# Sie brauchen nur ein GET mit dem Token als Query-Parameter:
curl 'https://medel.es/api/captcha/verify?token=YOUR_TOKEN'
# OK: {"ok":true,"verified_at":"2026-06-22 12:24:56"}
# FEHL: {"ok":false,"error":"already_used"}
Migrieren Sie von Google reCAPTCHA?
Das Widget füllt auch g-recaptcha-response und akzeptiert class="g-recaptcha". Wenn Ihr Backend es bereits liest, ändern Sie nur die Verify-URL:
// Vorher: $url = 'https://www.google.com/recaptcha/api/siteverify?secret=' . $secret . '&response=' . $token; // Nachher (ohne secret): $url = 'https://medel.es/api/captcha/verify?response=' . $token;
Endpoints
Vier REST-Endpoints. Kein SDK. Keine Auth. Keine Versionierung. Nur den, den Sie brauchen — den Rest ruft das Widget auf.
GET
https://medel.es/api/captcha/verify?token=…
Sie rufen es auf
Verifiziert das Token. Einmal-Nutzung: nach dem ersten erfolgreichen Verify invalidiert, kein Replay möglich.
200 OK:{"ok": true, "verified_at": "2026-06-22 12:24:56"}
400 KO:
{"ok": false, "error": "already_used"}
Codes: missing_token · unknown_token · already_used · expired · origin_mismatch
GET
https://medel.es/api/captcha/challenge
Wird vom Widget gerufen
Gibt eine Challenge aus (standardmäßig PoW, Slider-Puzzle bei verdächtiger IP). Das Widget ruft es automatisch.
POST
https://medel.es/api/captcha/solve
Wird vom Widget gerufen
Das Widget sendet die Lösung (PoW-Nonce oder Slider-X-Position) und erhält das verifizierbare Token.
GET
https://medel.es/api/captcha/stats
Öffentlich
Aggregierte Tagesstatistiken. Null persönliche Daten, null IPs, null Tracking.
Funktioniert in 98 %
ohne Konfiguration.
Funktioniert automatisch in
- HTTPS-Seiten
- Chrome / Edge / Firefox / Safari (2017+)
- localhost in der Entwicklung
- SPA (React / Vue / Svelte)
- Server-Rendered Forms
Wenn Sie strenge CSP haben
Fügen Sie die Domain zu 3 Direktiven hinzu:
script-src 'self' https://medel.es; connect-src 'self' https://medel.es; style-src 'self' https://medel.es;
Ehrliche Fragen, ehrliche Antworten
Wann erscheint das Slider-Puzzle?
Ist es für immer kostenlos?
Funktioniert es ohne JavaScript?
Tracken Sie meine Nutzer?
Warum Slider statt "Wählen Sie die Ampeln"?
Was, wenn Medel Captcha ausfällt?
reCAPTCHA-kompatibel?
Wie self-hoste ich es?
Snippet einfügen.
Vergessen Sie Bots.
In 30 Sekunden integrieren. Keine Karte. Keine Keys. Keine Verträge. Kein Kleingedrucktes. Wenn ein Bot reinwill, wird es sein Problem — nicht Ihres.