Skip to main content
Signals are the enriched data points tracenow computes for every event. When you write a rule condition — velocity.ip.failed_count_1h gt 5 — you are referencing a signal by its exact field name. This page is the authoritative reference for every field a rule can use. Rules are built from conditions: { field, operator, value }. Supported operators are eq (equals), gt (greater than), and lt (less than). See Rules for the full rule and policy model.
Device signals (device.*) require the Cloudflare integration to be active — the Worker injects trace.min.js which collects the fingerprint. Without it, device.* fields are null.User-keyed signals (velocity.user.*, ip.is_new_country_for_user, ip.impossible_travel, device.is_new_for_user) reach full fidelity only when you pass a real subject_user_id in the in-app call. At the edge these signals fall back to using the submitted email as the account key, which is still useful but less precise.

ip.*

IP reputation and geo signals. Evaluated on every event.
The enrichment response also includes geo (country, country_code), AS info (asn, name, type), and fields like is_bot, bot_name, is_anonymous, and is_harmful. These are visible on individual traces in the dashboard but are not directly addressable in rule conditions — only the fields in the table above are.

email.*

Email quality and risk signals. Evaluated when email is present in the event. Common rule patterns:

phone.*

Phone risk signals. Evaluated when phone is present in the event (most relevant for otp events in SMS pumping protection). Common rule patterns:

device.*

Device fingerprint signals. Requires the Cloudflare integration — the Worker injects trace.min.js, which collects the fingerprint and attaches the device token to requests. Without it, all device.* fields are null. device.is_new_for_user additionally requires a subject_user_id (or falls back to email) to know what “new for this account” means.
The /validate response also includes visitor_id and canvas_randomized — these are visible on individual traces but are not directly addressable in rule conditions.

velocity.ip.*

Request counters keyed by IP address. Measure activity from a single IP across all users and accounts. velocity.ip.failed_count_1h combined with event.status eq "failed" is the canonical credential stuffing signal.

velocity.user.*

Request counters keyed by user account. Requires a subject_user_id (or falls back to email) to identify the account. velocity.user.distinct_ips_24h gt 3 is a strong account takeover signal — a real user rarely logs in from four different IPs in a day.

velocity.device.*

Request counters keyed by device fingerprint. Detects a single device spreading across multiple accounts — a pattern common in fake-account factories and account takeover rings. velocity.device.distinct_user_ids_24h gt 3 means the same physical device (or browser profile) has touched more than three accounts today — a strong fake-account signal.

event.status

The outcome of the event. Evaluated on every event, regardless of which other signals are present. event.status is always used in combination with other signals. Status alone rarely justifies a verdict — it tells you what happened, and the other signals tell you why it’s suspicious. See Events for how status is determined at the edge vs. in the in-app call.

Signal availability by call origin

Signals in practice

The highest-signal combination for fake account detection:
See Fake accounts for example policies.
Credential stuffing, brute force, and suspicious access patterns:
See Account takeover for example policies.
Stopping fraudulent OTP send requests before they cost you:
See SMS pumping for example policies.

Next steps

Rules

Build conditions from these fields, combine them with AND/OR logic, and wire them into policies that return allow, challenge, or deny.

Verdicts

What allow, challenge, and deny mean — and how to handle each in your app.