API-Dokumentation
Kostenlose JSON-API für HTTP/3-Prüfungen – ohne Anmeldung, ohne Key, mit CORS.
Überblick
Die API ist kostenlos, braucht keine Anmeldung und keinen Key. Sie antwortet JSON und sendet
Access-Control-Allow-Origin: * – du kannst sie also direkt aus dem Browser aufrufen.
Rate Limit: 15 Anfragen / 60s je IP-Adresse.
GET /api/v1/check
Führt eine echte Prüfung durch: liest den Alt-Svc-Header und baut anschließend
eine echte QUIC-Verbindung auf. Dauert ein paar Sekunden, weil dabei mit dem Zielserver
gesprochen wird.
curl "https://h3check.de/api/v1/check?domain=example.org"
| Parameter | Werte | Bedeutung |
|---|---|---|
domain | Pflicht | Zu prüfende Domain. https://, Pfade und Ports werden automatisch entfernt. |
host | auto · root · www | Wie angegeben prüfen, ohne www. erzwingen oder mit. Standard auto. |
share | 0 · 1 | Standard 0. Mit 1 erscheint die Domain in der öffentlichen Liste und bekommt eine Seite unter /check/. |
Hinweis zum Datenschutz: API-Aufrufe veröffentlichen standardmäßig nichts.
Wenn du Kundendomains prüfst, lass share einfach weg.
Antwort
{
"domain": "example.org",
"ok": true,
"advertised": {
"alt_svc": "h3=\":443\"; ma=86400",
"advertises_h3": true
},
"connection": {
"tls_version": "TLS 1.3",
"tls_cipher": "TLS_AES_256_GCM_SHA384",
"negotiated_version": "2",
"has_ipv6": true
},
"verified": {
"http3_only": true,
"curl_http_version": "3",
"http_code": 200,
"effective_url": "https://example.org/",
"hint": null,
"response_headers": "HTTP/3 200 ...",
"has_headers": true
},
"self_check": { "detected": false, "hint": null }
}
Die zwei entscheidenden Felder: advertised.advertises_h3 sagt, dass der Server
HTTP/3 verspricht, verified.http3_only sagt, dass er es auch
geliefert hat. Versprechen ohne Lieferung ist fast immer eine Firewall, die UDP/443
blockt – siehe HTTP/3 aktivieren.
verified.response_headers enthält die Rohheader und kann ein paar Kilobyte groß
sein. Wenn du sie nicht brauchst, ignorier das Feld.
GET /api/v1/cached
Liefert das gespeicherte Ergebnis der letzten öffentlichen Prüfung – ohne Live-Verbindung, antwortet sofort und belastet dein Rate Limit kaum. Ideal für Dashboards und Badges.
curl "https://h3check.de/api/v1/cached?domain=example.org"
{
"ok": true,
"cached": true,
"domain": "example.org",
"checked_at": 1785421715,
"checked_at_iso": "2026-07-30T14:28:35+00:00",
"http3": { "working": true, "advertised": true, "alt_svc": "h3=\":443\"; ma=86400" },
"connection": { "tls_version": "TLS 1.3", "has_ipv6": true, "http_code": 200 },
"stack": { "server": "cloudflare", "cdn": "Cloudflare" }
}
advertised und has_ipv6 können null sein – das heißt „nicht gemessen“, nicht „nein“.
Fehler
| Status | error_code | Wann |
|---|---|---|
| 400 | invalid_domain | Keine gültige Domain oder eine Beispiel-Domain. |
| 404 | not_cached | Nur /cached: noch kein gespeichertes Ergebnis. |
| 429 | rate_limited | Rate Limit erreicht. Retry-After nennt die Wartezeit. |
Auch Fehler kommen als JSON und tragen immer "ok": false.
Beispiele
// JavaScript – dank CORS direkt aus dem Browser
const r = await fetch('https://h3check.de/api/v1/check?domain=example.org');
const data = await r.json();
console.log(data.verified.http3_only ? 'HTTP/3 läuft' : 'kein HTTP/3');
<?php // PHP
$d = json_decode(file_get_contents(
'https://h3check.de/api/v1/cached?domain=example.org'
), true);
echo $d['http3']['working'] ? 'ja' : 'nein';
Badge
Jede öffentlich geprüfte Domain hat ein SVG-Badge, das sich selbst aktualisiert:
<img src="https://h3check.de/badge/example.org.svg" height="30">
Stabilität
Der Pfad /api/v1/ ist versioniert: Felder können dazukommen, bestehende ändern
ihre Bedeutung nicht und verschwinden nicht. Die ältere Form
/?domain=…&format=json funktioniert weiter und liefert dasselbe Objekt wie
/api/v1/check.