In Produktion · 99,9 % Uptime v2.0

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.

100 % self-hosted Null Cookies Null Tracking Ohne Limits
demo.html — Live testen
Checkbox anhaken. Null CPU bis dahin.
0
Challenges issued today
0
Verified
0
Tokens consumed
0€
Cost per use
So funktioniert es

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.

01

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.

02

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.

03

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.

Vergleich

Gleiches Ziel.
Bessere Konsequenzen.

Alles, was reCAPTCHA für Sie tut, tut mCaptcha auch. Was reCAPTCHA Ihren Nutzern antut, nicht.

Google reCAPTCHA
mCaptcha Empfohlen
Keine Registrierung, keine API-Keys
Null User-Tracking
Null Drittanbieter-Cookies
Null CPU bis zur ersten Interaktion
100 % self-hosted (keine externe Abhängigkeit)
Kompatibel mit bestehendem reCAPTCHA-Code
Unbegrenzte kostenlose Verifizierungen
Einfache CSP-Konfiguration
Komplex
Minimal
Widget-Größe (gzipped)
~150 KB
~6 KB
Installation

Zwei Zeilen. Fertig.

Kein npm install. Kein Dashboard zum Registrieren. Keine Keys zum Kopieren. Snippet einfügen, deployen, Ticket schließen.

HTML
<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>
Null Impact auf First Paint Das Skript lädt async defer. Nichts läuft, bis der Nutzer anhakt. Ihre Core Web Vitals werden es danken.
Hell, dunkel oder automatisch Folgt standardmäßig prefers-color-scheme des Browsers. Erzwingen mit data-theme="dark|light" am Widget-Div.
Drop-in für reCAPTCHA-Code Akzeptiert class="g-recaptcha" und füllt g-recaptcha-response. Migrieren ohne eine einzige Backend-Zeile anzufassen.
Native Mobile- und Touch-Bedienung Das Slider-Puzzle reagiert auf Finger wie ein nativer Control. Keine obskuren Fahrrad-Selektoren auf 4-Zoll-Screens.
Verifizierung

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;
API

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.

Kompatibilität

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;
FAQ

Ehrliche Fragen, ehrliche Antworten

Wann erscheint das Slider-Puzzle?
Nur wenn Ihre IP in der letzten Stunde mehr als 30 Verifizierungen ausgelöst hat. Für 99 % Ihrer Nutzer endet der Flow mit einem Klick.
Ist es für immer kostenlos?
Ja. Keine Karte, kein Plan, keine Upsells. Der Dienst läuft über Rate-Limits pro IP (100/h) und pro Domain (5000/h). Brauchen Sie mehr? Schreiben Sie uns, wir heben es an.
Funktioniert es ohne JavaScript?
Nein. mCaptcha braucht JS, um den Proof-of-Work zu lösen oder den Slider zu ziehen. Erwarten Sie Non-JS-Traffic, behalten Sie einen HTML-Honeypot als Fallback.
Tracken Sie meine Nutzer?
Nein. Null Cookies, null Fingerprinting, null Analytics. Wir speichern die IP nur 24 h für Rate-Limiting, dann wird sie automatisch gelöscht.
Warum Slider statt "Wählen Sie die Ampeln"?
Bildraster-CAPTCHAs brauchen einen riesigen gelabelten Datensatz plus ML. Ein Slider ist visuell gleichwertig, braucht keine Fotodatenbank und funktioniert auf jedem Gerät — selbst dem ältesten Smartphone.
Was, wenn Medel Captcha ausfällt?
Das Widget zeigt Fehler und blockiert den Submit per Default. Als Integrator können Sie einen Bypass entscheiden, wenn verify in den Timeout läuft (5 Sekunden reichen). 99,9 % Uptime, aber Plan B liegt bei Ihnen.
reCAPTCHA-kompatibel?
Ja. Das Widget füllt automatisch g-recaptcha-response und akzeptiert class="g-recaptcha". Migration heißt: script src und verify URL austauschen. Null Refactor.
Wie self-hoste ich es?
Es ist PHP 8.2+ mit MySQL. Der Code landet auf GitHub unter MIT, sobald ich aufgeräumt habe. In der Zwischenzeit: schreiben Sie mich an und ich schicke ihn.

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.