diff --git a/CHANGELOG.md b/CHANGELOG.md index c562d3c..61c7f9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ All notable changes to this package are documented in this file. The format foll ## [Unreleased] +### Changed + +- `detection_flags` follows webhook schema `2026-10-13`: 20 public booleans. `vpn` covers a network VPN and an in-browser VPN or proxy. `os_mismatch` covers either operating-system mismatch check. The public set adds `ws_tcp_latency`, `device_spoofing`, `rate_limited`, `ai_bot` and `ai_browser`. + ## [1.0.1] - 2026-10-01 ### Fixed diff --git a/README.md b/README.md index 9838965..f99bcd7 100644 --- a/README.md +++ b/README.md @@ -418,7 +418,7 @@ webhook JSON. | `traffic_source` | object | `channel`, `referrer_domain`, `landing_url`, `click_id_type`, `utm_*` (`""` when absent) | | `risk_score` | `number` | 0-100, or 999 for the rate-limit marker | | `signals` | `{ name, weight, description }[]` | Weighted risk signals; `description` is `null` for webhooks | -| `detection_flags` | object of 19 booleans | `vpn`, `privacy_relay`, `browser_vpn_proxy`, `tor`, `proxy`, `datacenter_ip`, `abuser`, `os_mismatch`, `os_not_detected`, `timezone_mismatch`, `anti_detect_browser`, `browser_automation`, `ip_mismatch`, `incognito`, `search_bot`, `suspicious_paid_click`, `javascript_disabled`, `stun_not_checked`, `check_incomplete` | +| `detection_flags` | object of 20 booleans | `vpn`, `proxy`, `privacy_relay`, `check_incomplete`, `stun_not_checked`, `os_not_detected`, `timezone_mismatch`, `javascript_disabled`, `os_mismatch`, `ip_mismatch`, `ws_tcp_latency`, `anti_detect_browser`, `device_spoofing`, `rate_limited`, `incognito`, `search_bot`, `ai_bot`, `browser_automation`, `ai_browser`, `tor` | | `observed_at` | `string \| null` | RFC 3339 UTC with milliseconds, for example `2026-09-30T12:34:56.123Z` | | `source` | `'webhook' \| 'history'` | Which payload it was built from | | `raw` | object | The original payload, including fields the model omits | diff --git a/src/constants.ts b/src/constants.ts index ec50236..730bf19 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -18,7 +18,6 @@ export const SIGNALS = Object.freeze({ STUN_NOT_CHECKED: 'stun_not_checked', STUN_LATE_CORRECTION: 'stun_late_correction', OS_NOT_DETECTED: 'os_not_detected', - BROWSER_VPN_PROXY: 'browser_vpn_proxy', VPN: 'vpn', PRIVACY_RELAY: 'privacy_relay', PROXY: 'proxy', @@ -52,31 +51,32 @@ export const LOOKUP_TYPES: readonly LookupType[] = [ export type FlagKey = keyof DetectionFlags; -/** The 19 detection flag keys, in the order the webhook payload lists them. */ +/** The 20 detection flag keys, in the order the webhook payload lists them. */ export const FLAG_KEYS: readonly FlagKey[] = [ 'vpn', - 'privacy_relay', - 'browser_vpn_proxy', - 'tor', 'proxy', - 'datacenter_ip', - 'abuser', - 'os_mismatch', + 'privacy_relay', + 'check_incomplete', + 'stun_not_checked', 'os_not_detected', 'timezone_mismatch', - 'anti_detect_browser', - 'browser_automation', + 'javascript_disabled', + 'os_mismatch', 'ip_mismatch', + 'ws_tcp_latency', + 'anti_detect_browser', + 'device_spoofing', + 'rate_limited', 'incognito', 'search_bot', - 'suspicious_paid_click', - 'javascript_disabled', - 'stun_not_checked', - 'check_incomplete', + 'ai_bot', + 'browser_automation', + 'ai_browser', + 'tor', ]; /** Webhook schema version this SDK was built for. */ -export const KNOWN_SCHEMA_VERSION = '2026-06-01'; +export const KNOWN_SCHEMA_VERSION = '2026-10-13'; export const DEFAULT_HISTORY_BASE_URL = 'https://account.shieldlabs.ai'; export const DEFAULT_MANAGEMENT_BASE_URL = 'https://api.shieldlabs.ai'; diff --git a/src/normalize.ts b/src/normalize.ts index 8d85683..231fe30 100644 --- a/src/normalize.ts +++ b/src/normalize.ts @@ -90,7 +90,7 @@ const EXACT_SLUGS = new Map([ ['UA OS is not detected', 'os_not_detected'], ['Network OS is not detected', 'os_not_detected'], ['Browser timezone ≠ IP-timezone', 'timezone_mismatch'], - ['Browser VPN/Proxy', 'browser_vpn_proxy'], + ['Browser VPN/Proxy', 'vpn'], ['Browser Automation', 'browser_automation'], ['Port scan routed via proxy (antidetect browser pattern)', 'proxy_routed_antidetect'], ['User has been banned 1H, to many requests', 'rate_limited'], @@ -99,7 +99,7 @@ const EXACT_SLUGS = new Map([ const PREFIX_SLUGS: ReadonlyArray = [ ['Antidetect browser', 'antidetect_browser'], ['Os_mismatch', 'os_mismatch'], - ['OS mismatch2', 'os_mismatch2'], + ['OS mismatch2', 'os_mismatch'], ['TCP handshake', 'tcp_handshake_v2'], ['Latency test', 'ws_tcp_latency'], ['JavaScript disabled', 'javascript_disabled'], @@ -241,26 +241,26 @@ export function parseRfc3339(value: unknown): string | null { // Identification // --------------------------------------------------------------------------------------------- -type HistoryFlagKey = Exclude; +type HistoryFlagKey = Exclude; const HISTORY_FLAG_COLUMNS: Readonly> = { - vpn: 'is_vpn', - privacy_relay: 'is_privacy_relay', - tor: 'is_tor', proxy: 'is_proxy', - datacenter_ip: 'is_datacenter', - abuser: 'is_abuser', - os_mismatch: 'is_os_mismatch', + privacy_relay: 'is_privacy_relay', + check_incomplete: 'check_incomplete', + stun_not_checked: 'is_stun_not_checked', os_not_detected: 'is_os_not_detected', timezone_mismatch: 'is_timezone_mismatch', + javascript_disabled: 'is_js_disabled', + ws_tcp_latency: 'is_latency_test', anti_detect_browser: 'is_antidetect', - browser_automation: 'is_browser_automation', + device_spoofing: 'is_device_spoof', + rate_limited: 'is_rate_limited', incognito: 'is_incognito', search_bot: 'is_search_bot', - suspicious_paid_click: 'is_suspicious_paid_click', - javascript_disabled: 'is_js_disabled', - stun_not_checked: 'is_stun_not_checked', - check_incomplete: 'check_incomplete', + ai_bot: 'is_ai_bot', + browser_automation: 'is_browser_automation', + ai_browser: 'is_ai_browser', + tor: 'is_tor', }; /** IP sentinel handling: trimmed, and "0.0.0.0" means no IP (""). */ @@ -342,8 +342,13 @@ export function fromHistoryRow(row: JsonObject): Identification { const searchBot = isTruthy(own(row, 'is_search_bot')); const flags = {} as DetectionFlags; for (const key of FLAG_KEYS) { - if (key === 'browser_vpn_proxy') { - flags[key] = own(row, 'connection_type') === 'browser_vpn_proxy'; + if (key === 'vpn') { + flags[key] = + isTruthy(own(row, 'is_vpn')) || + isTruthy(own(row, 'is_browser_vpn_proxy')) || + own(row, 'connection_type') === 'browser_vpn_proxy'; + } else if (key === 'os_mismatch') { + flags[key] = isTruthy(own(row, 'is_os_mismatch')) || isTruthy(own(row, 'is_os_mismatch2')); } else if (key === 'ip_mismatch') { flags[key] = !searchBot && (ipLeakDetail || (publicIp !== '' && localIp !== '' && publicIp !== localIp)); diff --git a/src/types.ts b/src/types.ts index 93266c4..64322c7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -50,27 +50,28 @@ export interface IdentificationSignal { description: string | null; } -/** The 19 stable detection flags. A flag the server did not send is false. */ +/** The 20 public detection flags. A flag the server did not send is false. */ export interface DetectionFlags { vpn: boolean; - privacy_relay: boolean; - browser_vpn_proxy: boolean; - tor: boolean; proxy: boolean; - datacenter_ip: boolean; - abuser: boolean; - os_mismatch: boolean; + privacy_relay: boolean; + check_incomplete: boolean; + stun_not_checked: boolean; os_not_detected: boolean; timezone_mismatch: boolean; - anti_detect_browser: boolean; - browser_automation: boolean; + javascript_disabled: boolean; + os_mismatch: boolean; ip_mismatch: boolean; + ws_tcp_latency: boolean; + anti_detect_browser: boolean; + device_spoofing: boolean; + rate_limited: boolean; incognito: boolean; search_bot: boolean; - suspicious_paid_click: boolean; - javascript_disabled: boolean; - stun_not_checked: boolean; - check_incomplete: boolean; + ai_bot: boolean; + browser_automation: boolean; + ai_browser: boolean; + tor: boolean; } /** diff --git a/test/data/normalization-cases.json b/test/data/normalization-cases.json index 0ccaff3..1449e9c 100644 --- a/test/data/normalization-cases.json +++ b/test/data/normalization-cases.json @@ -115,24 +115,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:56.123Z", "source": "history" @@ -233,24 +234,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": true, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": true, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:40:01.007Z", "source": "history" @@ -371,24 +373,25 @@ ], "detection_flags": { "vpn": true, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": true, + "stun_not_checked": true, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": true, - "check_incomplete": true + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T13:05:12.000Z", "source": "history" @@ -489,24 +492,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T13:10:00.500Z", "source": "history" @@ -605,24 +609,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": true, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T13:20:30.250Z", "source": "history" @@ -679,24 +684,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -751,24 +757,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -817,24 +824,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T13:10:00.5Z" }, @@ -879,24 +887,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T13:10:00.500Z", "source": "webhook" @@ -910,23 +919,26 @@ "connection_type": "proxy", "cookie_id": "2c9d1e8f-4b7a-4c3e-9d2f-1a8b7c6d5e4f", "detection_flags": { - "abuser": true, - "anti_detect_browser": false, - "check_incomplete": false, - "datacenter_ip": true, - "incognito": false, - "ip_mismatch": false, - "javascript_disabled": false, - "os_mismatch": false, - "os_not_detected": false, - "privacy_relay": false, + "vpn": false, "proxy": true, + "privacy_relay": false, + "check_incomplete": false, "stun_not_checked": false, - "suspicious_paid_click": false, + "os_not_detected": false, "timezone_mismatch": false, - "tor": false, - "vpn": false, - "browser_vpn_proxy": false + "javascript_disabled": false, + "os_mismatch": false, + "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, + "incognito": false, + "search_bot": false, + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "device_id": "6f1e2d3c-4b5a-5968-8776-655443322110", "device_type": "desktop", @@ -1023,24 +1035,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": true, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:56.000Z", "source": "webhook" diff --git a/test/data/normalizer-edge-cases.json b/test/data/normalizer-edge-cases.json index 04ff181..61ec372 100644 --- a/test/data/normalizer-edge-cases.json +++ b/test/data/normalizer-edge-cases.json @@ -14,11 +14,11 @@ "slug": "is_tor" }, { - "description": "\ufeffIs VPN", + "description": "Is VPN", "slug": "is_vpn" }, { - "description": "\u0085Is proxy\u0085", + "description": "…Is proxy…", "slug": "is_proxy" }, { @@ -46,19 +46,19 @@ "slug": "browser_vpn_proxy" }, { - "description": "Sticky verdict: IP \u2260 leakIP (192.0.2.1)", + "description": "Sticky verdict: IP ≠ leakIP (192.0.2.1)", "slug": "ip__neq__leakip" }, { - "description": "\u2260", + "description": "≠", "slug": "neq" }, { - "description": "a\u2260b", + "description": "a≠b", "slug": "a_neq_b" }, { - "description": "\u2260 edge \u2260", + "description": "≠ edge ≠", "slug": "neq__edge__neq" }, { @@ -74,16 +74,16 @@ "slug": "a_b" }, { - "description": "Cr\u00e8me Br\u00fbl\u00e9e", - "slug": "cr\u00e8me_br\u00fbl\u00e9e" + "description": "Crème Brûlée", + "slug": "crème_brûlée" }, { - "description": "Cre\u0300me", + "description": "Crème", "slug": "creme" }, { - "description": "\u65e5\u672c\u8a9e \u30c6\u30b9\u30c8", - "slug": "\u65e5\u672c\u8a9e_\u30c6\u30b9\u30c8" + "description": "日本語 テスト", + "slug": "日本語_テスト" }, { "description": "Value 123 (x) (y)", @@ -102,24 +102,24 @@ "slug": "javascript_disabled" }, { - "description": "\u0130stanbul", - "slug": "i\u0307stanbul" + "description": "İstanbul", + "slug": "i̇stanbul" }, { - "description": "\u01c5", - "slug": "\u01c6" + "description": "Dž", + "slug": "dž" }, { - "description": "\u216b", + "description": "Ⅻ", "slug": "unknown" }, { - "description": "x\u00b2", + "description": "x²", "slug": "x" }, { - "description": "\u0663", - "slug": "\u0663" + "description": "٣", + "slug": "٣" }, { "description": "Tab\there", @@ -138,7 +138,7 @@ "slug": "hello" }, { - "description": "IP \u2260 leakIP", + "description": "IP ≠ leakIP", "slug": "ip__neq__leakip" }, { @@ -146,7 +146,7 @@ "slug": "is_vpn" }, { - "description": "\u00a0Is tor\u3000", + "description": " Is tor ", "slug": "is_tor" }, { @@ -163,7 +163,7 @@ }, { "description": "OS mismatch2", - "slug": "os_mismatch2" + "slug": "os_mismatch" }, { "description": "Os_mismatch", @@ -174,16 +174,16 @@ "slug": "tcp_handshake_v2" }, { - "description": "\ud83d\ude00 emoji \ud83d\ude00", + "description": "😀 emoji 😀", "slug": "emoji" }, { - "description": "Stra\u00dfe", - "slug": "stra\u00dfe" + "description": "Straße", + "slug": "straße" }, { - "description": "\u03a3IGMA", - "slug": "\u03c3igma" + "description": "ΣIGMA", + "slug": "σigma" } ], "history_time_cases": [ @@ -208,7 +208,7 @@ "expected": "2026-09-30T12:34:56.500Z" }, { - "input": "\t2026-09-30 12:34:56.5\u0085", + "input": "\t2026-09-30 12:34:56.5…", "expected": "2026-09-30T12:34:56.500Z" }, { @@ -352,7 +352,7 @@ "country": "Germany", "connection_type": "direct", "score": 15, - "score_details": "[1, \"x\", null, {\"Value\": true, \"Description\": \"Is tor\"}, {\"Value\": 10.5, \"Description\": \"Is VPN\"}, {\"Value\": 15, \"Description\": \"Is VPN\"}, {\"Description\": \"Is proxy\"}, {\"Value\": 0, \"Description\": \"IP \u2260 leakIP (203.0.113.5 \u2260 198.51.100.9, source=shield)\"}, {\"Value\": -30, \"Description\": \"Stun passed (late arrival, corrected)\"}, {\"Value\": 5}]", + "score_details": "[1, \"x\", null, {\"Value\": true, \"Description\": \"Is tor\"}, {\"Value\": 10.5, \"Description\": \"Is VPN\"}, {\"Value\": 15, \"Description\": \"Is VPN\"}, {\"Description\": \"Is proxy\"}, {\"Value\": 0, \"Description\": \"IP ≠ leakIP (203.0.113.5 ≠ 198.51.100.9, source=shield)\"}, {\"Value\": -30, \"Description\": \"Stun passed (late arrival, corrected)\"}, {\"Value\": 5}]", "created_at": "2026-09-30 10:00:00.250", "ver": 1790762400250, "web_rtc_ip": "203.0.113.5", @@ -412,24 +412,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -496,24 +497,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -580,24 +582,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -663,24 +666,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -747,24 +751,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -846,24 +851,25 @@ "signals": [], "detection_flags": { "vpn": true, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": true, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": true, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": true, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": true, - "stun_not_checked": false, - "check_incomplete": true + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": true }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -930,24 +936,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1014,24 +1021,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1098,24 +1106,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1182,24 +1191,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1222,7 +1232,7 @@ "country": "Germany", "connection_type": "direct", "score": 15, - "score_details": "[{\"Value\": 0, \"Description\": \"IP \u2260 leakIP (x)\"}]", + "score_details": "[{\"Value\": 0, \"Description\": \"IP ≠ leakIP (x)\"}]", "created_at": "2026-09-30 10:00:00.250", "ver": 1790762400250, "web_rtc_ip": "198.51.100.4", @@ -1267,24 +1277,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": true, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1352,24 +1363,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1437,24 +1449,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1521,24 +1534,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1604,24 +1618,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1688,24 +1703,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1771,25 +1787,26 @@ "risk_score": 15, "signals": [], "detection_flags": { - "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": true, - "tor": false, + "vpn": true, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -1855,24 +1872,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": null, "source": "history" @@ -1938,24 +1956,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -2034,24 +2053,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -2117,24 +2137,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -2180,24 +2201,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": null, "source": "history" @@ -2241,24 +2263,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": null, "source": "history" @@ -2331,24 +2354,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T10:00:00.250Z", "source": "history" @@ -2457,24 +2481,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -2582,24 +2607,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -2717,24 +2743,25 @@ ], "detection_flags": { "vpn": true, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": true, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": true, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": true }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -2779,24 +2806,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -2851,24 +2879,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -2918,24 +2947,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -2990,24 +3020,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -3049,24 +3080,25 @@ "risk_score": 80, "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -3105,24 +3137,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -3165,24 +3198,25 @@ "signals": null, "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -3221,24 +3255,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -3303,24 +3338,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -3385,24 +3421,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -3454,24 +3491,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -3526,24 +3564,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -3596,24 +3635,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -3668,24 +3708,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -3741,24 +3782,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -3813,24 +3855,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -3886,24 +3929,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -3958,24 +4002,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -4030,24 +4075,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -4102,24 +4148,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -4175,24 +4222,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -4247,24 +4295,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -4320,24 +4369,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T14:34:57.482913041+02:00" }, @@ -4392,24 +4442,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -4465,24 +4516,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "yesterday" }, @@ -4537,24 +4589,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": null, "source": "webhook" @@ -4609,24 +4662,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" }, @@ -4681,24 +4735,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -4754,24 +4809,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z", "high_value": { @@ -4830,24 +4886,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482Z", "source": "webhook" @@ -4891,24 +4948,25 @@ "signals": [], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": null, "source": "webhook" diff --git a/test/data/signal-slug-cases.json b/test/data/signal-slug-cases.json index 2a73957..bb3cc8a 100644 --- a/test/data/signal-slug-cases.json +++ b/test/data/signal-slug-cases.json @@ -47,7 +47,7 @@ }, { "description": "Browser VPN/Proxy", - "slug": "browser_vpn_proxy" + "slug": "vpn" }, { "description": "Browser Automation", @@ -75,7 +75,7 @@ }, { "description": "OS mismatch2 (TCP behaviour: ttl)", - "slug": "os_mismatch2" + "slug": "os_mismatch" }, { "description": "TCP handshake (window)", diff --git a/test/data/webhook-identification-scored.json b/test/data/webhook-identification-scored.json index f2de2d2..b42704a 100644 --- a/test/data/webhook-identification-scored.json +++ b/test/data/webhook-identification-scored.json @@ -1,6 +1,6 @@ { "event_type": "identification.scored", - "schema_version": "2026-06-01", + "schema_version": "2026-10-13", "created_at": "2026-09-30T12:34:57.482913041Z", "data": { "request_id": "02f1d973-84db-4156-a7f7-e799e6bf389b", @@ -50,24 +50,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": true, - "datacenter_ip": true, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": true, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": true, + "ws_tcp_latency": false, + "anti_detect_browser": true, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": true, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T12:34:57.482913041Z" } diff --git a/test/data/webhook-identification-scored.raw.txt b/test/data/webhook-identification-scored.raw.txt index a4da089..77d7650 100644 --- a/test/data/webhook-identification-scored.raw.txt +++ b/test/data/webhook-identification-scored.raw.txt @@ -1 +1 @@ -{"event_type":"identification.scored","schema_version":"2026-06-01","created_at":"2026-09-30T12:34:57.482913041Z","data":{"request_id":"02f1d973-84db-4156-a7f7-e799e6bf389b","visitor_id":"bde0e249-20d8-4544-838c-ed9a0b6d7a36","device_id":"ac7c303d-971b-41d1-8e25-cd5b46b46aed","session_id":"bde78778-efd2-4c49-952f-1f11b9c05f35","cookie_id":"4449bb58-590c-444c-ae1f-d1ddc768dbdd","user_hid":"9f86d081884c7d659a2feaa0c55ad015","domain":"example.com","public_ip":{"ip":"203.0.113.24","country":"Netherlands"},"local_ip":{"ip":"198.51.100.23","country":"Germany"},"connection_type":"proxy","os":"Windows","browser":"Chrome","device_type":"desktop","traffic_source":{"channel":"Google Ads","referrer_domain":"google.com","landing_url":"https://shop.example.com/signup?utm_source=google\u0026utm_medium=cpc\u0026gclid=abc123","click_id_type":"gclid","utm_source":"google","utm_medium":"cpc","utm_campaign":"","utm_content":"","utm_term":""},"risk_score":80,"signals":[{"name":"proxy","weight":10},{"name":"datacenter_ip","weight":10},{"name":"antidetect_browser","weight":60}],"detection_flags":{"vpn":false,"privacy_relay":false,"browser_vpn_proxy":false,"tor":false,"proxy":true,"datacenter_ip":true,"abuser":false,"os_mismatch":false,"os_not_detected":false,"timezone_mismatch":false,"anti_detect_browser":true,"browser_automation":false,"ip_mismatch":true,"incognito":false,"search_bot":false,"suspicious_paid_click":true,"javascript_disabled":false,"stun_not_checked":false,"check_incomplete":false},"observed_at":"2026-09-30T12:34:57.482913041Z"}} \ No newline at end of file +{"event_type":"identification.scored","schema_version":"2026-10-13","created_at":"2026-09-30T12:34:57.482913041Z","data":{"request_id":"02f1d973-84db-4156-a7f7-e799e6bf389b","visitor_id":"bde0e249-20d8-4544-838c-ed9a0b6d7a36","device_id":"ac7c303d-971b-41d1-8e25-cd5b46b46aed","session_id":"bde78778-efd2-4c49-952f-1f11b9c05f35","cookie_id":"4449bb58-590c-444c-ae1f-d1ddc768dbdd","user_hid":"9f86d081884c7d659a2feaa0c55ad015","domain":"example.com","public_ip":{"ip":"203.0.113.24","country":"Netherlands"},"local_ip":{"ip":"198.51.100.23","country":"Germany"},"connection_type":"proxy","os":"Windows","browser":"Chrome","device_type":"desktop","traffic_source":{"channel":"Google Ads","referrer_domain":"google.com","landing_url":"https://shop.example.com/signup?utm_source=google&utm_medium=cpc&gclid=abc123","click_id_type":"gclid","utm_source":"google","utm_medium":"cpc","utm_campaign":"","utm_content":"","utm_term":""},"risk_score":80,"signals":[{"name":"proxy","weight":10},{"name":"datacenter_ip","weight":10},{"name":"antidetect_browser","weight":60}],"detection_flags":{"vpn":false,"proxy":true,"privacy_relay":false,"check_incomplete":false,"stun_not_checked":false,"os_not_detected":false,"timezone_mismatch":false,"javascript_disabled":false,"os_mismatch":false,"ip_mismatch":true,"ws_tcp_latency":false,"anti_detect_browser":true,"device_spoofing":false,"rate_limited":false,"incognito":false,"search_bot":false,"ai_bot":false,"browser_automation":false,"ai_browser":false,"tor":false},"observed_at":"2026-09-30T12:34:57.482913041Z"}} \ No newline at end of file diff --git a/test/data/webhook-rate-limited.json b/test/data/webhook-rate-limited.json index b9edf47..c72c8de 100644 --- a/test/data/webhook-rate-limited.json +++ b/test/data/webhook-rate-limited.json @@ -1,6 +1,6 @@ { "event_type": "identification.scored", - "schema_version": "2026-06-01", + "schema_version": "2026-10-13", "created_at": "2026-09-30T13:10:00.5Z", "data": { "request_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d", @@ -42,24 +42,25 @@ ], "detection_flags": { "vpn": false, - "privacy_relay": false, - "browser_vpn_proxy": false, - "tor": false, "proxy": false, - "datacenter_ip": false, - "abuser": false, - "os_mismatch": false, + "privacy_relay": false, + "check_incomplete": false, + "stun_not_checked": false, "os_not_detected": false, "timezone_mismatch": false, - "anti_detect_browser": false, - "browser_automation": false, + "javascript_disabled": false, + "os_mismatch": false, "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, "incognito": false, "search_bot": false, - "suspicious_paid_click": false, - "javascript_disabled": false, - "stun_not_checked": false, - "check_incomplete": false + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "observed_at": "2026-09-30T13:10:00.5Z" } diff --git a/test/data/webhook-test-delivery.json b/test/data/webhook-test-delivery.json index 8e214ce..8809d3f 100644 --- a/test/data/webhook-test-delivery.json +++ b/test/data/webhook-test-delivery.json @@ -5,23 +5,26 @@ "connection_type": "proxy", "cookie_id": "2c9d1e8f-4b7a-4c3e-9d2f-1a8b7c6d5e4f", "detection_flags": { - "abuser": true, - "anti_detect_browser": false, - "browser_vpn_proxy": false, - "check_incomplete": false, - "datacenter_ip": true, - "incognito": false, - "ip_mismatch": false, - "javascript_disabled": false, - "os_mismatch": false, - "os_not_detected": false, - "privacy_relay": false, + "vpn": false, "proxy": true, + "privacy_relay": false, + "check_incomplete": false, "stun_not_checked": false, - "suspicious_paid_click": false, + "os_not_detected": false, "timezone_mismatch": false, - "tor": false, - "vpn": false + "javascript_disabled": false, + "os_mismatch": false, + "ip_mismatch": false, + "ws_tcp_latency": false, + "anti_detect_browser": false, + "device_spoofing": false, + "rate_limited": false, + "incognito": false, + "search_bot": false, + "ai_bot": false, + "browser_automation": false, + "ai_browser": false, + "tor": false }, "device_id": "6f1e2d3c-4b5a-5968-8776-655443322110", "device_type": "desktop", @@ -68,5 +71,5 @@ "visitor_id": "7a6b5c4d-3e2f-5a1b-9c8d-7e6f5a4b3c2d" }, "event_type": "identification.scored", - "schema_version": "2026-06-01" + "schema_version": "2026-10-13" } diff --git a/test/normalize.test.ts b/test/normalize.test.ts index 1585800..256eb8e 100644 --- a/test/normalize.test.ts +++ b/test/normalize.test.ts @@ -80,7 +80,7 @@ describe('normalization-cases.json', () => { expect(withoutRaw(result)).toStrictEqual(testCase.expected); expect(result.raw).toBe(testCase.input); expect(Object.keys(result)).toEqual(IDENTIFICATION_KEYS); - expect(Object.keys(result.detection_flags)).toHaveLength(19); + expect(Object.keys(result.detection_flags)).toHaveLength(20); }); } }); diff --git a/test/webhooks.test.ts b/test/webhooks.test.ts index 9c23224..525f404 100644 --- a/test/webhooks.test.ts +++ b/test/webhooks.test.ts @@ -115,7 +115,7 @@ describe('constructEvent with the webhook fixtures', () => { const raw = loadBytes('webhook-identification-scored.raw.txt'); const event = webhooks.constructEvent(raw, sign(raw), SECRET) as IdentificationScoredEvent; expect(event.event_type).toBe('identification.scored'); - expect(event.schema_version).toBe('2026-06-01'); + expect(event.schema_version).toBe('2026-10-13'); expect(event.created_at).toBe('2026-09-30T12:34:57.482913041Z'); expect(withoutRaw(event.data)).toStrictEqual(expectedByName.get('webhook_scored')); expect(event.data.observed_at).toBe('2026-09-30T12:34:57.482Z'); @@ -163,12 +163,12 @@ describe('constructEvent with the webhook fixtures', () => { expect('data' in event).toBe(false); }); - it('parses the dashboard test delivery with 17 of 19 flags', () => { + it('parses the dashboard test delivery with the public flags', () => { const body = loadText('webhook-test-delivery.json'); const sent = JSON.parse(body) as { data: { detection_flags: Record } }; - expect(Object.keys(sent.data.detection_flags)).toHaveLength(17); + expect(Object.keys(sent.data.detection_flags)).toHaveLength(20); const event = webhooks.constructEvent(body, sign(body), SECRET) as IdentificationScoredEvent; - expect(Object.keys(event.data.detection_flags)).toHaveLength(19); + expect(Object.keys(event.data.detection_flags)).toHaveLength(20); expect(event.data.detection_flags.browser_automation).toBe(false); expect(event.data.detection_flags.search_bot).toBe(false); expect(event.data.user_hid).toBeNull(); @@ -222,7 +222,9 @@ describe('event parsing rules', () => { it('does not warn for the known schema version', () => { const warn = vi.spyOn(console, 'warn').mockImplementation(() => undefined); - construct(loadText('webhook-ping.raw.txt')); + construct( + '{"event_type":"webhook.ping","schema_version":"2026-10-13","created_at":"2026-09-30T12:00:00Z"}', + ); expect(warn).not.toHaveBeenCalled(); });