API ドキュメント

サイトの診断を、JSONのAPIとして使えます。登録もAPIキーも要りません。

REST · JSONv1登録・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);
ベースURLhttps://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。
GETPOST/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ページに置き換わります。ステータスコードだけで判定してください。

結果の読み方

結果の限界(DKIMセレクターの確認範囲、CTに載らないサブドメインなど)は、運営についてをご覧ください。不具合や、制限の相談は、お問い合わせからどうぞ。