Core conceptsSignals & fields

Signals & fields

The composable signal fields exposed on a scored session — what they mean, their types, and which are usable in custom rules.

A scored session exposes a vocabulary of signal fields. They surface in the verdict response (where applicable) and are the fields you compose rules over. The vocabulary tracks well-known bot-management mental models so they port cleanly.

Adding a field is always additive — existing rules keep working when new signals ship.

Field reference

FieldTypeSourceRule-usableNotes
scoreint 0 or 1–99combiner✅0 = not computed (sentinel), never the same as 1
bandenumbanding✅not_computed | definite | likely_automated | likely_human | verified
verified_botboolverified-bot match✅True only on real verification — never a UA claim alone
verified_bot_categorystring | nullverified-bot match✅e.g. Search, AI Crawler, AI Search
detection_idsint[]engines✅ (in / not in)Stable IDs from the detection registry
js_detection.passedbool | nullJS-detection engine✅Non-enforcing — a false never alone forces a bot verdict
static_resourceboolrequest classification✅Asset / extension / .well-known detection
behavioral.mouse_entropyfloat 0–1behavioral engine✅Randomness of pointer movement; humans trend high
behavioral.scroll_velocityfloat (px/s)behavioral engine✅Scroll speed profile
behavioral.visibility_changesintbehavioral engine✅Tab/visibility transitions observed
behavioral.first_input_delay_msintbehavioral engine✅Time to first genuine interaction
pathstringrequest context✅Request path, e.g. /login
ipstringrequest context✅Request IP
countrystringrequest context✅ISO country code
uastringrequest context✅User-agent string
session_tokenstringserver-minted❌Identifier, not a scoring input
ja4string | nulltrusted edge header✅ (v2)Null in v1 — no v1 engine reads it yet

The behavioral signals

The behavioral.* aggregates are Botect's core differentiator — they describe how a session interacts, which is far harder to spoof than headers or user-agent strings. They're the fields you'll most often build rules over:

  • mouse_entropy — humans move pointers in noisy, non-linear paths (high entropy); scripted clicks are jumpy or perfectly straight (low entropy).
  • scroll_velocity — natural scrolling has variable, decaying velocity; automation tends toward uniform or instantaneous jumps.
  • visibility_changes — real users switch tabs and windows; many bots never do.
  • first_input_delay_ms — humans take time to orient before acting; automation often fires immediately.

Behavioral signals accumulate as a session sends more events. A session with very few events may not yet have enough behavioral evidence to leave the not_computed band.

Privacy

Ingest stores no PII. Event payloads are whitelisted per event type to aggregates only (entropy, velocities, counts, timings) — raw inputs, content, and identifying data are rejected at the door with a 422. See Ingest events.

Page identity. The collector reports which page it ran on as a hash plus a normalized template, never a readable URL:

  • page_path_hash — a 16-character hash of the path. Identical paths hash identically, so repeat visits and sequential crawls are still detectable.
  • page_path_shape — the path with identifiers masked, so /orders/48812 and /orders/50193 both become /orders/{n}.

The query string and fragment are never collected, so tokens and email addresses in a URL never leave the browser.

Logged-in visitors. If you tell Botect that a session has authenticated in your application, we store a timestamp and nothing else. That endpoint accepts no request body and no query string at all, so a user id or email cannot reach it even by mistake — Botect learns that a session signed in, never who did. Neither field is rule-usable; use the path field (supplied by your own edge at verdict time) to write path rules.