本文へスキップ
ecdsa.com

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 が返ります。操作ごとにリファレンスページがあり、フィールド、実行できるサンプル、エラーコードを掲載しています。

AI エージェントや IDE のアシスタントは、MCP サーバー経由で同じ操作を呼び出せます。 API リファレンスをすべて見る

30 秒で最初の API 呼び出し

次のいずれかをターミナルまたはブラウザーのコンソールに貼り付けてください。サンプルは本物で、署名はこの鍵で検証に成功します。

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());
レスポンス 200
{
  "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_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.

各コードへの対処法と、SDK が再試行するコード

さらに詳しく

変更履歴

最新リリースは v1.1.0(2026年10月22日)です。 API のバージョンはパスで示されます。互換性のない変更を行う場合は /api/v2 として提供します。v1 のレスポンスにフィールドが追加されることはありますが、既存のフィールドが削除・変更されることはありません。

変更履歴をすべて見る