API ドキュメント
サイトの診断を、JSONのAPIとして使えます。登録もAPIキーも要りません。
REST · JSON v1 登録・APIキー不要 OpenAPI 3.1
はじめに 分析 探索 レポート その他 レート制限 エラー 結果の読み方
はじめに
無料・登録不要。 ベースURLは https://certadomain.com/api/v1 です。制限内なら、自由に使えます(利用規約 )。診断はすべて、DNS・登録情報・CTログの公開情報だけを使い、対象のウェブページは取得しません。
curl
curl -s "https://certadomain.com/api/v1/overview?domain=example.com"
Python
import time
import requests
def check(domain):
r = requests.get("https://certadomain.com/api/v1/overview", params={"domain": domain}, timeout=30)
if r.status_code == 429:
time.sleep(int(r.headers["Retry-After"]))
return check(domain)
r.raise_for_status()
return r.json()
report = check("example.com")
print(report["grade"], report["score"])
JavaScript
const res = await fetch("https://certadomain.com/api/v1/overview?domain=example.com");
if (!res.ok) {
const problem = await res.json(); // application/problem+json
throw new Error(problem.error); // e.g. "invalid_domain"
}
const report = await res.json();
console.log(report.grade, report.score);
ベースURL https://certadomain.com/api/v1
認証 不要(APIキーはありません)
形式 リクエスト・レスポンスともJSON(UTF-8)。エラーは application/problem+json
互換性 /v1 の中では、項目の追加だけを行い、削除や名前の変更はしません。未知の項目は無視してください。
仕様 /api/v1/openapi.json
エンドポイント
分析
GET /overview コスト 1
メール認証(60%)、DNS(25%)、登録情報(15%)をまとめた、100点満点のスコアとA〜Eの評価です。優先して直すべき項目を、最大6件返します。
パラメーター
名前 必須 説明 domain必須 ドメイン名またはホスト名。URLはホスト名に、日本語ドメインはpunycodeに変換されます。
リクエスト
curl -s "https://certadomain.com/api/v1/overview?domain=example.com"
レスポンス 200(一部を省略)
{
"domain": "example.com",
"target": "example.com",
"score": 96,
"grade": "A",
"email": {
"score": 93,
"grade": "protected",
"findings": [
{
"category": "dmarc",
"code": "DMARC_POLICY_REJECT",
"severity": "ok"
},
{
"category": "dmarc",
"code": "DMARC_NO_RUA",
"severity": "warning"
},
{
"category": "spf",
"code": "SPF_LOOKUP_OK",
"severity": "ok",
"params": {
"count": 0,
"limit": 10
}
}
],
"spf_lookups": {
"count": 0,
"limit": 10,
"voids": 0
}
},
"dns": {
"score": 100,
"zone": "example.com",
"dnssec": "valid",
"findings": [
{
"category": "ns",
"code": "NS_COUNT_OK",
"severity": "ok",
"params": {
"count": 2
}
},
{
"category": "ns",
"code": "NS_DIVERSITY_OK",
"severity": "ok",
"params": {
"networks": 6
}
}
]
},
"registration": {
"score": 100,
"data": {
"registered": "1995-08-14",
"expires": "2027-08-13",
"registrar": "RESERVED-Internet Assigned Numbers Authority",
"locked": true
}
},
"actions": [
{
"category": "dmarc",
"code": "DMARC_NO_RUA",
"severity": "warning"
}
],
"analyzed_at": 1794625564,
"cached": true
}
主な項目
score / grade総合スコアと評価。重大な指摘が1つでもあると、スコアは69以下になります。 email · dns · registration3つの観点それぞれのスコアと指摘。測定できなかった観点は除き、残りで重みを再配分します。 actions[]優先順位の高い指摘(criticalが先)。 analyzed_at診断を実行した時刻(Unix時間)。cached が true のときは、保存された結果を実行した時刻です。 cached保存済みの結果を返したときは true。
GET /dnshealth コスト 1
ネームサーバーの冗長性と応答、SOA・委任の整合性、DNSSEC、CAA、MXの解決を調べます。ネームサーバーには直接問い合わせます。
パラメーター
名前 必須 説明 domain必須 ドメイン名またはホスト名。URLはホスト名に、日本語ドメインはpunycodeに変換されます。
リクエスト
curl -s "https://certadomain.com/api/v1/dnshealth?domain=example.com"
レスポンス 200(一部を省略)
{
"domain": "example.com",
"zone": "example.com",
"score": 100,
"grade": "A",
"findings": [
{
"category": "ns",
"code": "NS_COUNT_OK",
"severity": "ok",
"params": {
"count": 2
}
},
{
"category": "ns",
"code": "NS_DIVERSITY_OK",
"severity": "ok",
"params": {
"networks": 6
}
},
{
"category": "dnssec",
"code": "DNSSEC_VALID",
"severity": "ok"
}
],
"nameservers": [
{
"host": "elliott.ns.cloudflare.com",
"ipv4": [
"108.162.195.228"
],
"ipv6": [
"2606:4700:58::a29f:2ce4"
],
"status": "ok",
"serial": 2420077714
}
],
"dnssec": "valid",
"caa_issuers": [],
"analyzed_at": 1794626559,
"cached": false
}
主な項目
zone見つかったゾーン(登録ドメイン)。 nameservers[]各ネームサーバーのアドレスと状態(ok、lame、timeout など)、SOAシリアル。 dnssecvalid、off、broken、unverified など。 findings[]code(安定した識別子)、severity(critical / warning / info / ok)、必要なら params。analyzed_at診断を実行した時刻(Unix時間)。cached が true のときは、保存された結果を実行した時刻です。 cached保存済みの結果を返したときは true。
GET POST /dmarc コスト 1
SPF・DKIM・DMARC・MXを、RFCに沿って調べます。サブドメインは組織ドメインのDMARCを継承し、SPFは10回のルックアップ制限を再帰的に数えます。POSTでは本文に {"domain":"example.com"} を渡します。
パラメーター
名前 必須 説明 domain必須 ドメイン名またはホスト名。URLはホスト名に、日本語ドメインはpunycodeに変換されます。
リクエスト
curl -s "https://certadomain.com/api/v1/dmarc?domain=example.com"
curl -s -X POST https://certadomain.com/api/v1/dmarc -H "content-type: application/json" \
-d '{"domain":"example.com"}'
レスポンス 200(一部を省略)
{
"domain": "example.com",
"summary": {
"grade": "protected"
},
"records": {
"dmarc": "v=DMARC1;p=reject;sp=reject;adkim=s;aspf=s",
"spf": "v=spf1 -all",
"dkim": {},
"mx": [
{
"pref": 0,
"host": ""
}
]
},
"spf_lookups": {
"count": 0,
"limit": 10,
"voids": 0
},
"findings": [
{
"category": "dmarc",
"code": "DMARC_POLICY_REJECT",
"severity": "ok"
},
{
"category": "dmarc",
"code": "DMARC_NO_RUA",
"severity": "warning"
},
{
"category": "spf",
"code": "SPF_LOOKUP_OK",
"severity": "ok",
"params": {
"count": 0,
"limit": 10
}
},
{
"category": "dkim",
"code": "DKIM_NONE_COMMON",
"severity": "info"
},
{
"category": "mx",
"code": "MX_FOUND",
"severity": "ok",
"params": {
"count": 1
}
}
],
"analyzed_at": 1794626562,
"cached": false
}
主な項目
summary.gradeprotected / partial / monitoring / unprotected。 spf_lookupscount が limit(10)を超えると、SPFが無効になります。records.dkimよく使われるセレクターの有無。見つからなくても、未設定とは限りません。 findings[]code(安定した識別子)、severity(critical / warning / info / ok)、必要なら params。analyzed_at診断を実行した時刻(Unix時間)。cached が true のときは、保存された結果を実行した時刻です。 cached保存済みの結果を返したときは true。
GET /phishing コスト 1
ドメイン名のパターン、DNS、登録日からの、フィッシングの疑わしさの目安です。サイトの内容は見ていません。
パラメーター
名前 必須 説明 domain必須 ドメイン名またはホスト名。URLはホスト名に、日本語ドメインはpunycodeに変換されます。
リクエスト
curl -s "https://certadomain.com/api/v1/phishing?domain=example.com"
レスポンス 200(一部を省略)
{
"domain": "example.com",
"verdict": "low",
"score": 0,
"registration": {
"source": "rdap",
"registered": "1995-08-14",
"changed": "2026-08-14",
"expires": "2027-08-13",
"registrar": "RESERVED-Internet Assigned Numbers Authority",
"age_days": 11415,
"days_to_expiry": 272,
"locked": true,
"dnssec": true
},
"findings": [
{
"code": "LOOKS_CLEAN",
"severity": "ok"
}
],
"analyzed_at": 1794626559,
"cached": false
}
主な項目
verdict / scorelow / medium / high と、根拠になったスコア。 registration登録日・有効期限・レジストラ・ロックの状態。RDAPのないTLDでは空になります。 analyzed_at診断を実行した時刻(Unix時間)。cached が true のときは、保存された結果を実行した時刻です。 cached保存済みの結果を返したときは true。
探索
GET /subdomains コスト 1
証明書透明性(CT)ログ(crt.shとCert Spotter)から、サブドメインを一覧にします。証明書が発行された名前だけが対象で、古い名前が残ることもあります。結果は2時間保存されます。
パラメーター
名前 必須 説明 domain必須 ドメイン名またはホスト名。URLはホスト名に、日本語ドメインはpunycodeに変換されます。
リクエスト
curl -s "https://certadomain.com/api/v1/subdomains?domain=example.com"
レスポンス 200(一部を省略)
{
"domain": "example.com",
"subdomains": [
"dev.example.com",
"emudhra-lab.example.com",
"example.com",
"m.example.com",
"products.example.com",
"support.example.com",
"www.example.com"
],
"count": 7,
"sources": [
"crt.sh",
"certspotter"
]
}
主な項目
subdomains[]見つかったホスト名(重複なし、昇順)。 sources[]結果を返した情報源。どちらか一方が成功すれば、結果を返します。 —このツールだけ、analyzed_at と cached を返しません。
両方の情報源が失敗すると、502 ct_unavailable を返します。
GET /takeover コスト 5
CTで見つけたサブドメイン(最大100件)のCNAMEを調べ、宙に浮いたものを検出します。DNSだけを使い、ページは取得しません。10秒以上かかることがあります。
パラメーター
名前 必須 説明 domain必須 ドメイン名またはホスト名。URLはホスト名に、日本語ドメインはpunycodeに変換されます。
リクエスト
curl -s "https://certadomain.com/api/v1/takeover?domain=example.com"
レスポンス 200(一部を省略)
{
"domain": "example.com",
"total": 6,
"scanned": 6,
"truncated": false,
"failed": 0,
"sources": [
"crt.sh",
"certspotter"
],
"summary": {
"critical": 1,
"warning": 0,
"info": 0
},
"findings": [
{
"code": "TAKEOVER_DANGLING_SERVICE",
"severity": "critical",
"params": {
"subdomain": "old.example.com",
"target": "example-app.azurewebsites.net",
"service": "Azure App Service"
}
}
],
"analyzed_at": 1794626569,
"cached": false
}
主な項目
summarycritical / warning / info の件数。 findings[].codeTAKEOVER_DANGLING_SERVICE、TAKEOVER_UNREGISTERED_TARGET、DANGLING_CNAME、TAKEOVER_CANDIDATE。total · scanned · truncated見つかった数、調べた数、上限で打ち切ったか。 failed調べられなかった件数(時間切れなど)。 analyzed_at診断を実行した時刻(Unix時間)。cached が true のときは、保存された結果を実行した時刻です。 cached保存済みの結果を返したときは true。
上の例は、実際のドメインでの結果ではなく、指摘が出たときの形を示すための架空の例です。
GET /lookalike コスト 5
入力したドメインに似せた候補を最大220件作り、登録済みのものをリスクの高い順に返します。4〜6秒かかります。登録されているだけでは、悪用の証拠にはなりません。
パラメーター
名前 必須 説明 domain必須 ドメイン名またはホスト名。URLはホスト名に、日本語ドメインはpunycodeに変換されます。
リクエスト
curl -s "https://certadomain.com/api/v1/lookalike?domain=paypal.com"
レスポンス 200(一部を省略)
{
"domain": "paypal.com",
"target": "paypal.com",
"generated": 90,
"scanned": 90,
"truncated": false,
"failed": 0,
"registered": 65,
"summary": {
"high": 1,
"medium": 21,
"low": 43
},
"analyzed_at": 1794626569,
"cached": false,
"items": [
{
"domain": "paypal-service.com",
"display": "paypal-service.com",
"type": "KEYWORD",
"mx": true,
"web": true,
"ns": [
"ns69.domaincontrol.com",
"ns70.domaincontrol.com"
],
"same_ns": false,
"registered": "2026-08-07",
"registrar": "GoDaddy.com, LLC",
"age_days": 99,
"risk": "high",
"signals": [
"RECENT",
"MX",
"WEB"
]
},
{
"domain": "p4yp4l.com",
"display": "p4yp4l.com",
"type": "HOMOGLYPH",
"mx": true,
"web": false,
"ns": [
"anahi.ns.cloudflare.com",
"bruce.ns.cloudflare.com"
],
"same_ns": false,
"registered": "2026-02-05",
"registrar": "Cloudflare, Inc.",
"age_days": 282,
"risk": "medium",
"signals": [
"MX"
]
}
]
}
主な項目
summaryhigh / medium / low の件数。 items[].typeHOMOGLYPH、IDN_HOMOGRAPH、TLD_SWAP、KEYWORD、OMISSION など。 items[].risk · signalsリスクと、その根拠(RECENT、MX、WEB、CORP_REGISTRAR など)。 generated · scanned · registered作った候補数、調べた数、登録済みの数。 analyzed_at診断を実行した時刻(Unix時間)。cached が true のときは、保存された結果を実行した時刻です。 cached保存済みの結果を返したときは true。
レポート
POST /reports コスト 1
結果を30日間保存し、推測されにくいIDを返します。IDを知っていれば、誰でも読めます。内容はサーバーが取得し直すため、利用者が書き換えることはできません。作成は、同じIPから5分間に20回までで、1日の総数にも上限があります。
パラメーター
名前 必須 説明 tool必須 overview · dmarc · phishing · subdomains · takeover · lookalike · dnshealth domain必須 対象のドメイン名。
リクエスト
curl -s -X POST https://certadomain.com/api/v1/reports -H "content-type: application/json" \
-d '{"tool":"overview","domain":"example.com"}'
レスポンス 201(一部を省略)
{
"id": "Ab3dE5gH7jKl",
"tool": "overview",
"domain": "example.com",
"created_at": 1794626569,
"expires_at": 1797218569
}
主な項目
id12文字のID。共有URLは https://certadomain.com/r/<id> です。 expires_at閲覧できなくなる時刻(Unix時間)。
GET /reports/{id} コスト 1
保存した結果を読みます。期限が切れたものや、存在しないIDは404です。
パラメーター
名前 必須 説明 id必須 作成時に返された12文字のID。
リクエスト
curl -s "https://certadomain.com/api/v1/reports/Ab3dE5gH7jKl"
レスポンス 200(一部を省略)
{
"tool": "overview",
"domain": "example.com",
"created_at": 1794626569,
"expires_at": 1797218569,
"result": {
"domain": "example.com",
"score": 96,
"grade": "A",
"cached": false
}
}
主な項目
result保存された結果。形は、そのツール自身のレスポンスと同じです。
GET /openapi.json コスト 0
このAPIのOpenAPI 3.1の仕様です。コード生成や、Swagger UI・Redocなどのビューアーで使えます。レート制限の対象外です。
リクエスト
curl -s "https://certadomain.com/api/v1/openapi.json"
レスポンス 200(一部を省略)
{
"openapi": "3.1.0",
"info": { "title": "Certadomain API", "version": "1.0.0", ... },
"paths": { ... }
}
GET / コスト 0
仕様とドキュメントへのリンク、使えるパスの一覧です。レート制限の対象外です。
リクエスト
curl -s "https://certadomain.com/api/v1/"
レスポンス 200(一部を省略)
{
"name": "Certadomain API",
"version": "1",
"openapi": "https://certadomain.com/api/v1/openapi.json",
"docs": "https://certadomain.com/api-docs.html",
"endpoints": [
"/dmarc",
"/dnshealth",
"/lookalike",
"/..."
]
}
レート制限
同じIPアドレスから、5分間に60ポイント までです(固定の時間枠)。各エンドポイントの「コスト」が、1回の呼び出しで消費するポイントです。takeover と lookalike は5、他は1で、索引と仕様は0です。
RateLimit-Limit時間枠あたりの上限(60)
RateLimit-Remaining残りのポイント
RateLimit-Reset時間枠が切り替わるまでの秒数
RateLimit-Policy60;w=300 の形のポリシー
Retry-After429のときだけ。待つべき秒数
HTTP/2 429
content-type: application/problem+json
ratelimit-limit: 60
ratelimit-remaining: 0
ratelimit-reset: 142
retry-after: 142
{
"type": "urn:certadomain:problem:rate_limited",
"title": "Rate limit reached",
"status": 429,
"detail": "Too many requests from this address. Wait for Retry-After seconds.",
"error": "rate_limited"
}
サイト全体のエッジにも、同じIPから5分間に100リクエストまでの制限があり、こちらに達するとCDNが遮断します。回数の集計の扱いは、プライバシーポリシー をご覧ください。
エラー
4xx・5xxの本文は、RFC 9457 の application/problem+json です。処理には、安定した error コードを使ってください。
HTTP/2 400
content-type: application/problem+json
{
"type": "urn:certadomain:problem:invalid_domain",
"title": "Invalid domain",
"status": 400,
"detail": "The value is not a valid domain name.",
"error": "invalid_domain"
}
ステータス error
400missing_domain · invalid_domain · invalid_json · invalid_tool · invalid_id
404not_found (存在しないパス、期限切れのレポート)
405method_not_allowed (Allow ヘッダーに、使えるメソッド)
413report_too_large
429rate_limited · report_limit
500server_error
502ct_unavailable (CTの2つの情報源がどちらも失敗。後で再試行)
503storage_unavailable
404だけは、本文を読まないでください。 CDNの設定により、404の本文はサイトのHTMLページに置き換わります。ステータスコードだけで判定してください。
結果の読み方
判定には findings[].code を使う :SPF_LOOKUP_EXCEEDED のようなコードは安定しています。意味は用語集 にまとめています。score と grade は優先順位をつけるための目安で、重みづけは変わることがあります。
キャッシュ :結果はドメインごとに、およそ1時間(CTは2時間)保存されます。cached と analyzed_at で、いつの結果か分かります。再取得を強制する方法はありません。
ブラウザからの利用 :CORSは https://certadomain.com だけに許可しています。ほかのサイトのページからではなく、自分のサーバーから呼び出してください。
同時実行 :takeover と lookalike は時間がかかります。タイムアウトは30秒以上に設定し、同時実行は少なめにしてください。
結果の限界(DKIMセレクターの確認範囲、CTに載らないサブドメインなど)は、運営について をご覧ください。不具合や、制限の相談は、お問い合わせ からどうぞ。