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/v1Maschinenlesbare 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.
- POST/v1/verifyVerify an ECDSA signature
- POST/v1/convertConvert a signature between DER and raw r‖s
- POST/v1/jwt/decodeDecode a JWT (no signature check)
- POST/v1/jwt/verifyVerify an ES256/ES384/ES512 JWT signature
- POST/v1/cert/decodeDecode an X.509 certificate or chain
- GET/v1/health/{domain}TLS signature-health grade for a domain
- GET/v1/webhooksList webhook endpoints
- POST/v1/webhooksCreate a webhook endpoint
- POST/v1/webhooks/deleteDelete a webhook endpoint
- POST/v1/webhooks/testSend a test event
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 -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"
}'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());{
"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.
| Code | HTTP | Bedeutung |
|---|---|---|
| invalid_json | 400 | The 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_field | 400 | A required field is absent or empty. |
| invalid_input | 400 | A field could not be parsed — the message explains exactly why. |
| private_key_rejected | 400 | The 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_algorithm | 400 | The token's algorithm is not one this operation verifies. |
| invalid_domain | 400 | Not a public DNS hostname (IP addresses, single-label names and paths are refused). |
| scan_dns_error | 400 | The domain does not resolve in public DNS. |
| scan_private_address | 400 | The domain resolves (at least partly) to a private or reserved address. |
| webhook_url_refused | 400 | The 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. |
| unauthorized | 401 | The 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_scope | 403 | The API key is valid but lacks a scope this operation requires; the message names it. |
| webhook_limit_reached | 403 | The account already has as many webhook endpoints as its plan allows. |
| not_found | 404 | No operation exists at this path. |
| webhook_not_found | 404 | The API key's account has no webhook endpoint with this id. |
| method_not_allowed | 405 | The path exists but does not accept this HTTP method; see the Allow header. |
| payload_too_large | 413 | The body exceeds 100 KB. |
| rate_limited | 429 | Too many requests — see Retry-After. |
| quota_exceeded | 429 | A 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_error | 500 | Unexpected server error. |
| scan_unreachable | 502 | The domain refused or dropped the connection on port 443. |
| scan_tls_error | 502 | The TLS handshake failed or presented no usable certificate. |
| service_unavailable | 503 | API keys cannot be verified right now (the key store is unreachable); retry shortly. |
| webhooks_unavailable | 503 | Webhooks are switched off on this server: it has no signing keys configured. |
| scan_timeout | 504 | The scan did not finish in time. |
| timeout | 504 | The 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
- API-ReferenzJede Operation mit ihren Feldern, Beispielen in curl, JavaScript und Python und ihren Fehlercodes.
- FehlercodesAlle 25 Codes: HTTP-Status, Auslöser, was zu tun ist und ob sich ein erneuter Versuch lohnt.
- ChangelogWas sich in v1 bisher geändert hat und was sich mit dem Start der API-Schlüssel ändert.
- MCP-ServerGib Claude, Cursor oder VS Code die Tools von ecdsa.com mit einer einzigen Zeile – kein Schlüssel nötig.
- SDKsOffizielle SDKs für 8 Sprachen folgen
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.