Risk Score API — Docs

Signal-based domain risk indicator (0–100). Technical indicators only — no verdicts, no advice.

OpenAPI (fixed contract): openapi.yaml (download)

Current version: v2.1 (Changelog).

Endpoint

POST /risk-score

Query parameters

Name Type Required Description
explain integer No Set to 1 to include explanations[] (one-line notes per signal).

Note: explanations are designed for UI display and remain intentionally short.

Authentication

Send your API key in the request header:

X-API-Key: YOUR_API_KEY

Example (curl)


    curl -X POST https://riskapi.analyses-web.com/risk-score?explain=1 \
    -H "Content-Type: application/json" \
    -H "X-API-Key: YOUR_API_KEY" \
    -d '{"url":"https://example.com"}'

Request

{
  "url": "https://example.com"
}

Rules: absolute HTTP/HTTPS URLs only · max length 2048 · computed per domain · cached (default TTL 24h).

Response

{
  "riskScore": 12,
  "riskLevel": "low",
  "signals": [
    "domain_age_lt_12_months",
    "dns_caa_missing"
  ],
  "version": "v2.1",
  "meta": {
    "cached": false,
    "processingMs": 83,
    "requestId": "b7f2d7b6d2d44d6aa0c96a5b1e9c7d7b",
    "cacheHours": 24,
    "scoringPolicy": "2026-01"
  }
}

Explanations (optional)

POST /risk-score?explain=1
{
  "riskScore": 42,
  "riskLevel": "medium",
  "signals": [
    "dns_spf_allows_all",
    "dns_dmarc_missing",
    "dns_caa_missing"
  ],
  "version": "v2.1",
  "meta": {
    "cached": true,
    "processingMs": 7,
    "requestId": "d0b0d9b1b8a44a8c8a5c2b9c8f6d1a2c",
    "cacheHours": 24,
    "scoringPolicy": "2026-01"
  },
  "explanations": [
    {
      "signal": "dns_spf_allows_all",
      "category": "risk",
      "severity": "high",
      "note": "Permissive SPF (+all or all without -/~/?all): makes email spoofing easier."
    },
    {
      "signal": "dns_caa_missing",
      "category": "informational",
      "severity": "info",
      "note": "CAA missing: very common; not meaningful on its own."
    }
  ]
}

Score & risk levels

The score is a weighted sum of risk signals. Informational signals remain visible but do not increase the score.

Score rangeriskLevel
0 – 24low
25 – 49medium
50 – 100high

meta.scoringPolicy identifies the internal scoring band (weights/thresholds) used to compute the score.

Signals

Signal Category What it indicates (short)
domain_age_lt_6_monthsriskDomain appears recently created.
domain_age_lt_12_monthsriskDomain appears relatively new.
suspicious_keywords_in_domainriskLogin/verify/billing-type keywords with context patterns.
long_or_hyphenated_domaininformationalLength/hyphen pattern; weak on its own.
dns_spf_missingriskNo SPF policy found in TXT records.
dns_spf_allows_allriskSPF effectively allows any sender (permissive “all”).
dns_dmarc_missingriskNo DMARC policy found at _dmarc.
dns_dmarc_policy_noneinformationalDMARC present but policy is monitoring-only (p=none).
dns_caa_missinginformationalNo CAA record (common); low signal strength.
dns_no_mx_recordsinformationalNo MX records; may be normal for some domains.
dns_ns_count_highinformationalUnusually high NS count.
dns_null_a_recordriskA record resolves to 0.0.0.0 (often used for sinkholes/blocks).
rdap_unavailableinformationalRDAP lookup failed/unavailable.
registrar_missing_in_rdapinformationalRegistrar name missing in RDAP response.
whois_redacted_or_privacyinformationalRegistrant data redacted/privacy indicated.
recent_nameserver_or_delegation_changeriskRecent NS/delegation change (short window).
recent_rdap_update_unknowninformationalRecent RDAP update event (unknown action).
recent_rdap_update_last_changedinformationalRecent RDAP event: “last changed”.
recent_rdap_update_rdap_dbinformationalRecent RDAP event: database update.
recent_rdap_update_otherinformationalRecent RDAP event: other action.
cctld_registrant_country_mismatchriskccTLD vs registrant country mismatch (best-effort).
spamhaus_drop_listed_ipriskResolved IP is listed in a DROP-style blocklist.
drop_list_unavailableinformationalBlocklist check failed/unavailable.
dns_lookup_failedinformationalDNS resolution/query failed for at least one lookup.
shared_hosting_asn_listedinformationalIP maps to a high-density hosting ASN (only if ASN lookup is enabled).
registrar_high_risk_listedinformationalRegistrar name matches a heuristic list (weak; informational only).

Signal IDs are stable. Informational signals have weight 0 and do not increase the score.

Rate limiting

Requests are rate-limited per IP (no-key) and enforced per key (monthly quota).

Monthly quota

When your key reaches its monthly quota, the API returns quota_exceeded (HTTP 429).

Usage

You can query your current monthly usage with GET /usage (requires API key header).

curl -s "https://riskapi.analyses-web.com/usage" \
  -H "X-API-Key: YOUR_KEY"

Errors

HTTP error When
400missing_urlRequest body missing url.
400url_too_longURL exceeds maximum length.
400invalid_urlNot an absolute HTTP/HTTPS URL.
401missing_api_keyAPI key header missing.
401invalid_api_keyKey not found or disabled.
503auth_unavailableKey store unavailable.
429rate_limitedPer-IP rate limit exceeded (no-key).
429quota_exceededMonthly quota exceeded (per key).

All errors share the same JSON shape:

{
  "error": "invalid_url",
  "requestId": "..."
}

Disclaimer

This API provides automated indicators derived from public technical signals. It does not provide security, legal, or financial advice. Accuracy is not guaranteed.

PricingProd checklist