Skip to content

Scores and reason codes

siteverify answers HTTP 200 with success, score, action, hostname, challenge_ts and error-codes. Our own endpoint /v1/siteverify also returns mode, reasons and cdata. The SDKs parse this for you (outcome.result).

Reasons are explanations for a score, not verdicts. Log them; do not build brittle logic on one code. A client must tolerate codes it does not know.

Code Read it as
AUTOMATION The signals looked automated.
UNEXPECTED_ENVIRONMENT The environment did not look like a normal browser or device.
TOO_MUCH_TRAFFIC Unusually many checks from the same source.
UNEXPECTED_USAGE_PATTERNS The behavior did not look like normal use.
DATACENTER_IP The address belongs to a datacenter network.
ANONYMIZER The address belongs to a privacy network. This alone never scores a person below 0.3.
INTEGRITY_FAILED Attestation or an integrity check failed.
LOW_CONFIDENCE_SCORE There was too little evidence to score with confidence.
NETWORK_MISMATCH The network at solve time did not match the network at check time. The score is capped at 0.3.
PLAN_RESTRICTED Your plan is restricted, so the check was a pass-through with no scoring. See billing and spend cap.

error-codes is the list of siteverify error codes. The full table is in the API reference. The common ones: missing-input-secret, invalid-input-secret, missing-input-response, invalid-input-response, timeout-or-duplicate, sitekey-secret-mismatch, site-disabled, quota-exceeded, plan-required, plan-restricted.

Treat every failure as “do not accept”. After a network error or an HTTP error the token may already be spent, so a retry needs a new token from the widget.