{ "threshold": 100, "rules": [ {"func": "fromKnownBotIP", "id": "botIpRange", "desc": "Common Bot IP range", "bot": 50 }, {"func": "matchesClient", "params": ["aol","msie","ffold","chromeold","oldedge","operaold"], "id": "oldClient", "desc": "Obsolete browser version", "bot": 40 }, {"func": "matchesPlatform", "params": ["winold", "macosold", "androidold"], "id": "oldOS", "desc": "Obsolete platform version", "bot": 40 }, {"func": "matchesPlatform", "params": ["winsrvr", "bsd"], "id": "serverOS", "desc": "Server OS", "bot": 40 }, {"func": "matchesPlatform", "params": ["null"], "id": "noOS", "desc": "Unknown or missing OS information", "bot": 40 }, {"func": "smallPageCount", "params": [1], "id": "onePage", "desc": "Visiter viewed only a single page", "bot": 20 }, {"func": "noRecord", "params": ["log"], "id": "noClient", "desc": "No client-side JS log was recorded", "bot": 50 }, {"func": "noRecord", "params": ["tck"], "id": "noTicks", "desc": "No client ticks were recorded", "bot": 10 }, {"func": "noReferrer", "id": "noRefs", "desc": "No referer field", "bot": 30 }, {"func": "matchesClient", "params": ["brave","operaold","msie","webkit"], "id": "susClient", "desc": "Client identifier that is popular with bot networks", "bot": 10 }, {"func": "matchesClient", "params": ["undici","gohttp"], "id": "botClient", "desc": "Client identifier indicates web crawler", "bot": 100 }, {"func": "matchesUserAgent", "params": [""], "id": "noUA", "desc": "Didn’t even bother to send a user-agent string", "bot": 50 }, {"func": "combinationTest", "params": [["macos","chromeold"],["macos","msie"],["winold","edge"],["winold","brave"]], "id": "suspPC", "desc": "Suspicious combination of platform and client", "bot": 30 }, {"func": "combinationTest", "params": [["macos","msie"],["win10","safari"],["macosold","brave"]], "id": "impPC", "desc": "Impossible combination of platform and client", "bot": 70 }, {"func": "loadSpeed", "params": [3, 20], "id": "speedRun", "desc": "Average time between page loads is less than 20 seconds", "bot": 60 }, {"func": "noAcceptLang", "id": "noAcc", "desc": "No “Accept-Language” header", "bot": 40 }, {"func": "matchLang", "params": [], "id": "langMatch", "desc": "Client’s ‘Accept-Language’ header does not match the page language", "bot": 30 }, {"func": "matchesClient", "params": ["whatsapp","applemsgs","goognblm","tiktok","meta","chatgpt","claude","perplexity"], "id": "previewClient", "desc": "User-triggered bot load (e.g. preview)", "bot": -120 } ] }