REST API v1・無料・API キー不要・CORS 有効
無料の署名 API
ecdsa.com のツールを支えるチェック処理を、スクリプト、CI、AI エージェントから呼び出せます。ECDSA 署名の検証、DER ⇄ 生形式の変換、ES256/ES384/ES512 の JWT のデコードと検証、X.509 証明書のデコード、ドメインの TLS 署名の健全性の評価に対応しています。HTTPS 上のシンプルな JSON でやり取りします(https://ecdsa.com/api/v1)。
curl -s https://ecdsa.com/api/v1機械可読な仕様:/api/v1/openapi.json(OpenAPI 3.1)
API でできること
どの操作も、入力だけで結果が決まる純粋関数です。JSON を送ると JSON が返ります。操作ごとにリファレンスページがあり、フィールド、実行できるサンプル、エラーコードを掲載しています。
- 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
AI エージェントや IDE のアシスタントは、MCP サーバー経由で同じ操作を呼び出せます。 API リファレンスをすべて見る
30 秒で最初の API 呼び出し
次のいずれかをターミナルまたはブラウザーのコンソールに貼り付けてください。サンプルは本物で、署名はこの鍵で検証に成功します。
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": []
}これは、まさにこのリクエストに対する API の実際の応答です。
次のステップ:この操作のすべてのフィールドとオプションは API リファレンスで、各エラーの意味はエラー一覧表で確認できます。
基本事項
無料、API キー不要
新規登録もトークンも不要で、管理すべきクォータもありません。リクエストを送れば JSON が返ってきます。上限の高いオプションの API キーは、ecdsa.com のアカウント機能とともに提供される予定です。
IP あたり毎分 60 リクエスト
スクリプトや CI には十分な量です。ドメインのヘルスチェックの操作は外部に向けてスキャンを行うため、これとは別に毎分 10 回の枠が設けられています。
CORS 対応
すべてのレスポンスに Access-Control-Allow-Origin: * が付くので、ブラウザー、ドキュメントページ、サーバーレス関数から API を直接呼び出せます。
秘密鍵は送信しない
PEM の PRIVATE KEY ブロック、OpenSSH・SSH2・PuTTY の秘密鍵、または「d」を含む JWK が含まれるリクエストは、private_key_rejected で拒否されます。秘密の情報を扱う場合は、ブラウザー上でローカルに動作するツールを使ってください。これらのツールは入力内容を送信しません。
ログ記録なし
リクエストボディはメモリ上で解析され、ログに書き込まれることはありません。
レート制限
API 全体で IP あたり毎分 60 リクエスト、さらに外向きの TLS 接続を開く /v1/health/{domain} には毎分 10 回の制限があります。
すべてのレスポンスには X-RateLimit-Limit、X-RateLimit-Remaining、X-RateLimit-Reset が含まれます。制限を超えると、Retry-After ヘッダー付きで 429 が返されます。
ドメインを実際にスキャンする場合は、全利用者で共有する枠も消費します。1 つのホストがスキャンされるのは 10 分あたり最大 6 回、全スキャンの合計は毎分最大 300 回までです。そのため、API を使ってサーバーに大量のリクエストを送りつけることはできません。1 時間のキャッシュから返される応答は枠を消費しません。枠を超えたスキャンには、429 rate_limited と Retry-After が返されます。
API キーを使う場合は、代わりにキーごとに制限されます(無料プランは毎分 120 回、Pro プランは毎分 600 回)。また、アカウントの日次・月次のクォータも消費します。キーは ecdsa.com のアカウント機能とともに提供される予定で、まだ作成できません。それまでは、すべての呼び出しが匿名で扱われます。
より多くの呼び出し回数と監視機能を提供する予定です。料金を確認し、ウェイトリストに登録してください。
記載の数値は厳密な上限ではなく、想定している利用枠として扱ってください。429 を受け取ったらリクエストの間隔を空け、利用側でもキャッシュしてください。ドメインのヘルスチェックの結果は、すでに 1 時間キャッシュされています。
エラー
エラーはすべて JSON で、機械可読なコードと、入力の何が問題だったかを正確に説明する人間向けのメッセージを含みます。ブラウザーのツールが表示するのと同じ説明です。エラーレスポンスの docs フィールドには、このページへのリンクが入ります。
| コード | HTTP | 意味 |
|---|---|---|
| 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. |
さらに詳しく
変更履歴
最新リリースは v1.1.0(2026年10月22日)です。 API のバージョンはパスで示されます。互換性のない変更を行う場合は /api/v2 として提供します。v1 のレスポンスにフィールドが追加されることはありますが、既存のフィールドが削除・変更されることはありません。