Zum Inhalt springen
ecdsa.com

REST-API v1 · kostenlos · ohne API-Schlüssel · CORS aktiviert

Kostenlose Signatur-API

Die Prüfungen hinter den Tools von ecdsa.com, aufrufbar aus Skripten, CI und KI-Agenten: ECDSA-Signaturen prüfen, DER ⇄ Raw konvertieren, JWTs mit ES256/ES384/ES512 dekodieren und prüfen, X.509-Zertifikate dekodieren, den Zustand der TLS-Signaturen einer Domain bewerten. Reines JSON über HTTPS – https://ecdsa.com/api/v1

curl -s https://ecdsa.com/api/v1

Maschinenlesbare Spezifikation: /api/v1/openapi.json (OpenAPI 3.1)

Was die API kann

Jede Operation ist eine reine Funktion ihrer Eingabe: JSON senden, JSON zurückbekommen. Zu jeder gibt es eine Referenzseite mit ihren Feldern, einem ausführbaren Beispiel und ihren Fehlercodes.

KI-Agenten und IDE-Assistenten rufen dieselben Operationen über den MCP-Server auf. Vollständige API-Referenz

Dein erster Aufruf in 30 Sekunden

Füge einen dieser Aufrufe in ein Terminal oder eine Browser-Konsole ein. Das Beispiel ist echt: Die Signatur besteht die Prüfung mit dem Schlüssel.

curl
curl -sS 'https://ecdsa.com/api/v1/verify' \
  -H 'content-type: application/json' \
  -d '{
  "publicKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4+8TCP3Hop/Acb8L7reksO9flyt1\nsUhvEqUs7a45RVDRDtAIZdTnOJcAhTCQvdzUBO4KUyxSRcZm6ro+2RGfSQ==\n-----END PUBLIC KEY-----",
  "message": "The quick brown fox jumps over the lazy dog",
  "signature": "3045022100df542bb71e0e3019086f1b1ba51f1aa0ec5e6afca05c3f5a7f4f02f5b7c39d24022030c59f1ac6d8c6893fb2a5ac8dfd9388d31ebd3382510dcfb7f28f9182eb1131"
}'
JavaScript (fetch)
const response = await fetch("https://ecdsa.com/api/v1/verify", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({
    "publicKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4+8TCP3Hop/Acb8L7reksO9flyt1\nsUhvEqUs7a45RVDRDtAIZdTnOJcAhTCQvdzUBO4KUyxSRcZm6ro+2RGfSQ==\n-----END PUBLIC KEY-----",
    "message": "The quick brown fox jumps over the lazy dog",
    "signature": "3045022100df542bb71e0e3019086f1b1ba51f1aa0ec5e6afca05c3f5a7f4f02f5b7c39d24022030c59f1ac6d8c6893fb2a5ac8dfd9388d31ebd3382510dcfb7f28f9182eb1131"
  }),
});
console.log(response.status, await response.json());
Antwort 200
{
  "valid": true,
  "curve": "P-256",
  "curvesTried": [
    "P-256"
  ],
  "keySource": "pem-spki",
  "signatureFormat": "der",
  "details": {
    "r": "df542bb71e0e3019086f1b1ba51f1aa0ec5e6afca05c3f5a7f4f02f5b7c39d24",
    "s": "30c59f1ac6d8c6893fb2a5ac8dfd9388d31ebd3382510dcfb7f28f9182eb1131",
    "highS": false
  },
  "notes": []
}

Das ist die Antwort der API auf genau diese Anfrage.

Als Nächstes: alle Felder und Optionen dieser Operation in der API-Referenz und die Bedeutung jedes Fehlers in der Fehlertabelle.

Das Wichtigste

Kostenlos, ohne API-Schlüssel

Keine Registrierung, keine Tokens, keine Kontingente, die du verwalten musst. Anfrage senden, JSON zurückbekommen. Optionale API-Schlüssel mit höheren Limits gibt es künftig mit den Konten auf ecdsa.com.

60 Anfragen/min pro IP

Großzügig für Skripte und CI. Für den Domain-Check gilt zusätzlich ein Budget von 10 pro Minute, weil er nach außen scannt.

CORS offen

Access-Control-Allow-Origin: * in jeder Antwort – rufe die API direkt aus einem Browser, einer Dokumentationsseite oder einer Serverless-Funktion auf.

Keine privaten Schlüssel senden

Anfragen mit einem PEM-Block „PRIVATE KEY“, einem privaten OpenSSH-, SSH2- oder PuTTY-Schlüssel oder einem JWK mit „d“ werden mit private_key_rejected abgewiesen. Für alles Geheime nutze die lokalen Browser-Tools – sie übertragen deine Eingabe nie.

Nichts wird protokolliert

Der Body jeder Anfrage wird im Arbeitsspeicher geparst und nie in Logs geschrieben.

Rate Limits

60 Anfragen pro Minute und IP für die gesamte API, dazu 10 pro Minute für /v1/health/{domain} – dieser Endpunkt öffnet ausgehende TLS-Verbindungen.

Jede Antwort enthält X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset; beim Überschreiten eines Limits kommt 429 mit dem Header Retry-After zurück.

Echte Scans einer Domain zehren außerdem von Budgets, die für alle gemeinsam gelten: Ein Host wird höchstens 6-mal in 10 Minuten gescannt, alle Scans zusammen höchstens 300-mal pro Minute – so lässt sich die API nicht nutzen, um einen Server zu überfluten. Antworten aus dem einstündigen Cache verbrauchen nichts; ein Scan über ein Budget hinaus wird mit 429 rate_limited und Retry-After beantwortet.

Mit einem API-Schlüssel gelten die Limits stattdessen pro Schlüssel – 120 pro Minute im Free-Tarif, 600 im Pro-Tarif –, und die Aufrufe zehren von den Tages- und Monatskontingenten des Kontos. Schlüssel gibt es erst mit den Konten auf ecdsa.com, noch lassen sie sich nicht erstellen; bis dahin ist jeder Aufruf anonym.

Mehr Aufrufe und Monitoring sind geplant: Sieh dir die Preise an und trag dich in die Warteliste ein.

Betrachte die dokumentierten Zahlen als vorgesehenes Budget, nicht als harte Obergrenze: Drossle bei 429 höflich deine Anfragen und speichere Ergebnisse auf deiner Seite zwischen – Ergebnisse des Domain-Checks werden ohnehin eine Stunde lang zwischengespeichert.

Fehler

Jeder Fehler ist JSON mit einem maschinenlesbaren Code und einer menschenlesbaren Meldung, die genau sagt, was an der Eingabe falsch war – dieselben Erklärungen, die auch die Browser-Tools anzeigen. Fehlerantworten verlinken im Feld docs hierher.

CodeHTTPBedeutung
invalid_json400The body is not valid JSON or not a JSON object; or the input nests arrays and objects more than 64 levels deep (JSON documents inside string fields count too), or is too complex to inspect for private keys.
missing_field400A required field is absent or empty.
invalid_input400A field could not be parsed — the message explains exactly why.
private_key_rejected400The request contains private-key material (a PEM PRIVATE KEY block, an OpenSSH, SSH2 or PuTTY private key, or a JWK with "d"). Never send private keys anywhere.
unsupported_algorithm400The token's algorithm is not one this operation verifies.
invalid_domain400Not a public DNS hostname (IP addresses, single-label names and paths are refused).
scan_dns_error400The domain does not resolve in public DNS.
scan_private_address400The domain resolves (at least partly) to a private or reserved address.
webhook_url_refused400The webhook URL cannot receive deliveries: it is not https on port 443, its host is not a public DNS name, or the name does not resolve or resolves (at least partly) to a private or reserved address.
unauthorized401The Authorization or X-API-Key header is malformed, the API key is not valid (wrong checksum, unknown, revoked or expired), or the operation needs a key.
forbidden_scope403The API key is valid but lacks a scope this operation requires; the message names it.
webhook_limit_reached403The account already has as many webhook endpoints as its plan allows.
not_found404No operation exists at this path.
webhook_not_found404The API key's account has no webhook endpoint with this id.
method_not_allowed405The path exists but does not accept this HTTP method; see the Allow header.
payload_too_large413The body exceeds 100 KB.
rate_limited429Too many requests — see Retry-After.
quota_exceeded429A daily or monthly quota of the API key's account is used up. X-Quota-Reset (and Retry-After) say when it starts over; retrying earlier cannot succeed.
internal_error500Unexpected server error.
scan_unreachable502The domain refused or dropped the connection on port 443.
scan_tls_error502The TLS handshake failed or presented no usable certificate.
service_unavailable503API keys cannot be verified right now (the key store is unreachable); retry shortly.
webhooks_unavailable503Webhooks are switched off on this server: it has no signing keys configured.
scan_timeout504The scan did not finish in time.
timeout504The operation did not finish within its time budget.

Was bei jedem Code zu tun ist und bei welchen Codes die SDKs die Anfrage wiederholen

Entdecken

Changelog

Neuestes Release: v1.1.0, 22. Oktober 2026. Die API ist im Pfad versioniert; inkompatible Änderungen kämen als /api/v2 – Antworten von v1 können neue Felder erhalten, verlieren oder ändern aber keine bestehenden.

Vollständiges Changelog