Skip to main content
POST
The Domain Security endpoint does not require a chain ID as it analyzes domains and URLs rather than blockchain addresses.

Choosing a policy

liveness_policy resolves one uncertainty: our check was blocked and cannot tell whether a visitor would have been. Everything with a definite observation behind it — a 404, a sale placeholder, a domain that does not resolve — reads the same under every policy. Switching policy costs nothing and never changes risk_level. A site behind bot protection returns the same http_status: 403 under both policies; the Try It examples Bot Protection (lenient) and Bot Protection (strict) show the two readings.

Latency

liveness_check: false (the default) is the fast path. liveness_check: true adds latency. A recently checked host answers almost immediately; a host not checked before takes noticeably longer, and in the worst case returns unknown while the real answer is prepared in the background — a repeat request shortly after will have it. If that does not fit your flow, run the check on a background job and read the result on the next call. Results are cached per host. last_scanned_at tells you how old any answer is — when the check ran, not when this response was generated. Apply your own freshness rule against it if you need one tighter than ours.

Limits

  • The answer is per host, not per path. A host can be usable while one path on it is gone.
  • Automation blocks are indistinguishable. We cannot tell “this site blocks all tools” from “this site blocks the addresses our checks come from”. Both read as accessible under lenient.
  • A determined site can show us something different. A malicious site can serve a clean page to anything that looks like a security check and the real payload to actual visitors.
Availability is a strong signal, but not reliable enough to be the only input to a decision.

Errors

All errors use the standard envelope: code, status, and detail. An availability check that fails never fails the request. You receive 200 with the risk verdict intact and the two availability fields omitted.

Request/Response Fields

The availability check is evaluated per host, so every URL sharing a host shares one availability answer. accessible answers “would a visitor see usable content?”, so a working server is not sufficient on its own: a root path returning 404, 5xx or a for-sale placeholder reads as not_accessible. liveness maps from status: accessiblealive, not_accessibledead, and unknown when the result could not be determined or liveness_policy is evidence.
Absence is not a negative. If liveness_check was true but the check could not run, liveness and liveness_detail are omitted. Treat a missing field as “no answer”, never as “not accessible”.
Request fields accept both camelCase and snake_case. See Request Field Names.

Headers

X-API-KEY
string
required

Your HashDit API key

Body

application/json

Domain or URL to analyze

url
string
required

The domain or URL to analyze. A scheme, path and query string are accepted and normalized.

Example:

"https://pancakeswap.finance/"

livenessCheck
boolean
default:false

When true, also report whether a visitor opening this URL would see usable content. Adds latency. A healthy server answering a request is not sufficient. Also accepts liveness_check.

livenessPolicy
enum<string>
default:lenient

How to resolve the case where the check was blocked and cannot tell whether a visitor would have been. Only meaningful when livenessCheck is true. Any other value is rejected with HTTP 422. Also accepts liveness_policy. Switching policy never changes risk_level.

  • lenient (default) — blocked check is accessible. Use when warning users: a site that only blocks automation still works for the person about to click it.
  • strict — blocked check is not_accessible. Use when vetting a submitted site; expect some manual review.
  • evidence — returns no verdict; status is null and you decide from http_status
Available options:
lenient,
strict,
evidence

Response

Successful response

code
string

API status code. "0" indicates success.

Example:

"0"

status
string

Request status (ok or error).

Example:

"ok"

data
object