Anfragen pro Minute
30 Anfragen/Minute dauerhaft (Burst: 30). Bei Überschreitung wird 429 rate_limited mit einem Retry-After-Header zurückgegeben.
Mit der InstantProof-REST-API können Sie jede öffentliche URL programmatisch zertifizieren. Authentifizieren Sie sich mit einem Bearer-API-Schlüssel, senden Sie eine URL per POST und erhalten Sie ein signiertes PDF-Zertifikat mit vollständigem Beweispaket — mit demselben RFC 3161-Zeitstempel und derselben Ed25519-Signatur wie über die Weboberfläche.
Drei Schritte von null bis zum signierten PDF-Zertifikat.
Melden Sie sich an, gehen Sie zu Entwickler → API-Schlüssel und klicken Sie auf API-Schlüssel erstellen. Kopieren Sie den Schlüssel — er wird nur einmal angezeigt.
Senden Sie eine POST-Anfrage mit Ihrer URL:
curl -X POST https://secure.instantproof.legal/api/v1/certificates \
-H "Authorization: Bearer ip_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/page-to-certify"}'
Antwort 201 Created:
{
"certificateId": "abc123…",
"recordingId": "def456…",
"url": "https://example.com/page-to-certify",
"finalUrl": "https://example.com/page-to-certify",
"status": "ready",
"links": {
"self": "/api/v1/certificates/def456…",
"certificate": "/api/v1/certificates/def456…/download"
}
}
Folgen Sie der URL links.certificate mit Ihrem API-Schlüssel. Der Server gibt eine 302-Weiterleitung zu einer vorsignierten Download-URL zurück:
curl -L \
-H "Authorization: Bearer ip_live_xxxxxxxxxxxxxxxx" \
"https://secure.instantproof.legal/api/v1/certificates/def456…/download" \
-o certificate.pdf
Das heruntergeladene PDF ist dasselbe signierte PDF-Zertifikat, das die Weboberfläche erzeugt, und kann unter /de/certificate.html überprüft werden.
Basis-URL: https://secure.instantproof.legal
Alle Endpunkte geben JSON zurück. Authentifizierung: Authorization: Bearer <key>.
Erstellt ein neues Website-Zertifikat. Die Plattform erfasst die URL in einem Headless-Browser, erzeugt ein HAR-Netzwerkprotokoll und einen Screenshot, signiert das Manifest mit Ed25519 und verankert es mit einem qualifizierten RFC 3161-Zeitstempel. Der Vorgang dauert 10–60 Sekunden.
| Feld | Typ | Beschreibung | |
|---|---|---|---|
url | string | erforderlich | Eine gültige https://-URL zur Zertifizierung. Muss öffentlich erreichbar sein. |
| Feld | Typ | Beschreibung |
|---|---|---|
certificateId | string | Menschenlesbare Zertifikats-ID (auf dem PDF angezeigt). |
recordingId | string | Interne Aufzeichnungs-UUID. In nachfolgenden API-Aufrufen verwenden. |
url | string | Die von Ihnen übermittelte URL. |
finalUrl | string | Die URL nach etwaigen Weiterleitungen, wie vom Browser gesehen. |
status | string | "ready" — das Zertifikat ist sofort verfügbar. |
links.self | string | Pfad zum Abrufen der Metadaten dieses Zertifikats. |
links.certificate | string | Pfad zum Herunterladen des PDFs. Erfordert Authentifizierung. |
| Status | error | Bedeutung |
|---|---|---|
| 400 | invalid_url | Das Feld url fehlt oder ist keine gültige https://-Adresse. |
| 400 | invalid_json | Der Anfragetext ist kein gültiges JSON. |
| 401 | invalid_api_key | Fehlender oder ungültiger Authorization-Header. |
| 402 | api_access_required | Ihr Konto verfügt nicht über den Pro-Tarif. Abonnieren. |
| 403 | subscription_required | Website-Zertifikate erfordern ein Pauschal-Abonnement. |
| 403 | insufficient_scope | Dem API-Schlüssel fehlt der Geltungsbereich certificates:write. |
| 413 | payload_too_large | Der Anfragetext überschreitet 64 KB. |
| 429 | quota_exceeded | Tägliches API-Erfassungskontingent erreicht. Wird täglich zurückgesetzt. |
| 429 | rate_limited | Zu viele Anfragen. Siehe Retry-After-Header. |
| 429 | service_busy | Erfassungsdienst ausgelastet. Nach ca. 30 Sekunden erneut versuchen. |
| 502 | capture_failed | Der Browser konnte die URL nicht laden. |
| 502 | certification_failed | Die Erfassung lieferte keine verwertbaren Beweise (z. B. leeres HAR). |
Ruft die Metadaten eines zuvor von Ihnen erstellten Zertifikats ab.
| Parameter | Beschreibung | |
|---|---|---|
recordingId | erforderlich | Die von POST /api/v1/certificates zurückgegebene recordingId. |
| Feld | Typ | Beschreibung |
|---|---|---|
certificateId | string | Menschenlesbare Zertifikats-ID. |
recordingId | string | Interne Aufzeichnungs-UUID. |
type | string | Aufzeichnungstyp (z. B. "webcapture"). |
status | string | "ready", sobald das Zertifikat verfügbar ist. |
url | string | Die zertifizierte URL. |
createdAt | string | Erstellungszeitstempel im Format ISO 8601. |
links | object | Pfade self und certificate. |
Lädt das signierte PDF-Zertifikat herunter. Gibt 302 Found zurück — folgen Sie der Weiterleitung, um die Datei zu erhalten. Verwenden Sie curl -L oder requests.get(..., allow_redirects=True).
Alle API-Anfragen müssen Folgendes enthalten:
Authorization: Bearer ip_live_xxxxxxxxxxxxxxxx
Schlüssel werden unter Einstellungen → Entwickler → API-Schlüssel erstellt. Ein Schlüssel authentifiziert sich als Ihr Konto — behandeln Sie ihn wie ein Passwort. Widerrufen Sie ihn sofort, falls er offengelegt wird.
Schlüssel für Live-Konten beginnen mit dem Präfix ip_live_. Das Präfix hilft Ihnen, sie im Code oder in Umgebungsdateien zu erkennen.
30 Anfragen/Minute dauerhaft (Burst: 30). Bei Überschreitung wird 429 rate_limited mit einem Retry-After-Header zurückgegeben.
Der Pro-Tarif gewährt eine feste Anzahl an Zertifikatserstellungen pro Tag. Das Kontingent wird täglich zurückgesetzt. Bei Überschreitung wird 429 quota_exceeded zurückgegeben.
Der JSON-Anfragetext darf 64 KB nicht überschreiten. In der Praxis liegt eine URL deutlich unter diesem Limit.
import requests
API_KEY = "ip_live_xxxxxxxxxxxxxxxx"
BASE = "https://secure.instantproof.legal"
# Ein Zertifikat erstellen
resp = requests.post(
f"{BASE}/api/v1/certificates",
json={"url": "https://example.com"},
headers={"Authorization": f"Bearer {API_KEY}"},
)
resp.raise_for_status()
data = resp.json()
recording_id = data["recordingId"]
# Das PDF herunterladen
pdf = requests.get(
f"{BASE}/api/v1/certificates/{recording_id}/download",
headers={"Authorization": f"Bearer {API_KEY}"},
allow_redirects=True,
)
pdf.raise_for_status()
with open("certificate.pdf", "wb") as f:
f.write(pdf.content)
print(f"Certificate saved ({len(pdf.content)} bytes)")
const API_KEY = process.env.INSTANTPROOF_API_KEY;
const BASE = "https://secure.instantproof.legal";
// Ein Zertifikat erstellen
const res = await fetch(`${BASE}/api/v1/certificates`, {
method: "POST",
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com" }),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const { recordingId, links } = await res.json();
// Das PDF herunterladen
const pdf = await fetch(`${BASE}${links.certificate}`, {
headers: { "Authorization": `Bearer ${API_KEY}` },
redirect: "follow",
});
const buffer = Buffer.from(await pdf.arrayBuffer());
require("fs").writeFileSync("certificate.pdf", buffer);
# Schlüssel setzen
export INSTANTPROOF_API_KEY="ip_live_xxxxxxxxxxxxxxxx"
# Erstellen
CERT=$(curl -sf -X POST https://secure.instantproof.legal/api/v1/certificates \
-H "Authorization: Bearer $INSTANTPROOF_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}')
echo "$CERT" | python3 -m json.tool
RECORDING_ID=$(echo "$CERT" | python3 -c "import sys,json; print(json.load(sys.stdin)['recordingId'])")
# Herunterladen
curl -sfL \
-H "Authorization: Bearer $INSTANTPROOF_API_KEY" \
"https://secure.instantproof.legal/api/v1/certificates/$RECORDING_ID/download" \
-o certificate.pdf
ls -lh certificate.pdf
Typischerweise 10–60 Sekunden, abhängig von der Ladezeit der Zielseite. Die POST-Anfrage blockiert, bis das Zertifikat fertig ist — es gibt keinen Polling-Schritt.
Die aktuelle API unterstützt ausschließlich die Website-Zertifizierung (URL). Datei-Uploads sind über die Weboberfläche unter secure.instantproof.legal/certificates/new verfügbar.
Ja. Das von der API erzeugte PDF ist identisch mit einem über die Weboberfläche erstellten. Ziehen Sie es auf instantproof.legal/de/certificate.html, um die Ed25519-Signatur und die RFC 3161-Zeitstempelkette zu überprüfen.
Der Erfassungsdienst gibt einen Fehler 502 capture_failed zurück. Ihr Tageskontingent wird nicht verbraucht.
Ja. Jedes über die API erstellte Zertifikat erscheint in Ihrem Zertifikate-Dashboard unter Meine Website-Zertifikate, zusammen mit allen über die Weboberfläche erstellten Zertifikaten.