Home → Learn → Behavioral bot detection
Behavioral bot detection
Most of the effort in this field goes into the fingerprint: canvas, WebGL, fonts, timezone, the user agent. That work is worth doing, and it answers exactly one question — what machine is this? It does not answer the second question sites ask, which is whether a person is actually driving it. That question is answered by how you move, type and wait, and a flawless fingerprint does not touch it.
The two halves of the problem
It helps to separate them, because they fail in completely different ways and the fixes have nothing in common.
| Fingerprint | Behavior | |
|---|---|---|
| Question | What machine is this? | Is a human operating it? |
| Measured | Once, at page load | Continuously, for the whole session |
| Signals | Canvas, WebGL, fonts, screen, timezone, headers | Keystroke timing, cursor path, scroll, dwell, action rhythm |
| Typical failure | Two accounts share one value and get linked | One session looks synthetic and gets challenged |
The distinction matters because the symptoms differ. A fingerprint problem links accounts to each other — you get a wave of related actions across accounts that should have nothing to do with one another. A behavior problem does not link anything; it just raises friction on the one session in front of it. More captchas, more verification, a login that needs a code every time.
What is actually being measured
Browsers hand out a lot of timing for free, and none of it requires anything clever on the site's part. Every one of these is available to ordinary JavaScript on any page.
Keystroke timing
Two numbers come out of typing. Dwell is how long a key is held down;
flight is the gap between releasing one key and pressing the next. Both are
reported by keydown and keyup events with millisecond timestamps.
Human flight times cluster in the tens to low hundreds of milliseconds and vary constantly —
common letter pairs are quicker, reaching for a number is slower, and everyone slows down at
the end of a word.
Automation, by default, has no timing at all. Both Puppeteer and Playwright will set an input's value in a single synchronous operation unless you explicitly ask them not to. A twenty-character password appearing in under a millisecond is not a subtle signal. It is not a thing a keyboard can physically do.
Cursor movement
A real cursor arrives at a button along a curved path, overshoots slightly, corrects, and
accelerates and decelerates on the way. A scripted click usually produces no
mousemove events at all — the pointer simply is at the target, then the click
fires. A session with clicks and zero movement between them is trivially separable from one
with a person in it.
Dwell time and reading speed
The gap between a page finishing loading and the first meaningful action is a strong signal precisely because it is bounded by human physiology. Nobody reads a form, decides, and submits in 200 milliseconds. Automation that moves as fast as the network allows produces timings that no person could generate, and that is easier to detect than any fingerprint mismatch.
The rhythm across a session
People are inconsistent. They pause, re-read, switch tabs, get distracted, and come back. A script that performs the same sequence of actions at the same pace forty times produces a variance close to zero across the whole run. Low variance over many repetitions is the easiest pattern in this entire list to spot, and it needs no machine learning to find.
The mistake almost everyone makes next
The obvious fix is to add a delay. Set 100 milliseconds between keystrokes and the "instant" problem disappears.
Except a perfectly even 100ms gap is also impossible for a human. You have not removed the tell, you have moved it — from "typed impossibly fast" to "typed with the precision of a metronome". The same applies to a fixed pause between actions, or a delay drawn uniformly from a range: uniform randomness has a flat distribution, and human timing does not. Real intervals have a long tail. Most keystrokes fall in a narrow band, and occasionally someone stops to think, and that asymmetry is part of the signature.
The practical lesson is that variance itself is the signal, not the average. Randomizing is necessary. Randomizing in a way that produces an unnaturally clean distribution is a different tell wearing the first one's clothes.
What this means for real work
If you are automating your own accounts — posting to your own storefronts, checking your own listings, running your own test suite — you are not trying to defeat anything. You are trying to stop legitimate work from being misclassified, which is a much narrower goal and a much more achievable one.
- Do not type instantly. This is the single highest-value change, because it is the most binary: the gap is either physically possible or it is not.
- Do not act faster than a person could read. If a step depends on content that just loaded, the delay before acting on it should reflect that someone looked at it.
- Let the pace vary between runs. Identical timing across many repetitions is more distinctive than any single fast action within one of them.
- Do not disable things to hide. Blocking canvas or spoofing a screen size to an impossible value produces a rarer signature than the one you were worried about. The same principle applies here: the aim is to look ordinary, not to look absent.
Where the two halves meet
Neither half rescues the other. A perfectly human typing rhythm does not help if three accounts share one canvas hash — they are still visibly the same machine. An immaculate, internally consistent fingerprint does not help if the session fills a form in zero milliseconds — it is a very convincing machine with obviously nobody at the keyboard.
This is worth saying plainly because the two get sold as one thing. Most tools in this category work entirely on the fingerprint and describe the result as undetectability, which it is not. It is half of the problem, addressed well.
What Parallel does about it
Typing in a Parallel automation is not instant. Each keystroke is separated by a randomized 40–120ms gap — randomized rather than fixed, for exactly the reason above. If a step sets its own delay, that still wins, including a delay of zero when you deliberately want speed.
The fingerprint half is handled separately: each profile gets a complete, internally consistent identity and its own proxy, and the combination is checked for contradictions — like a New York IP with a Karachi timezone — before the browser launches.
We will not tell you this makes automation undetectable, because nobody can honestly tell you that. Detection is a moving target and behavior is only one input to it. What it does is remove the signals that are trivially, physically wrong, which is the category that gets ordinary work flagged.
Related reading
- Browser fingerprinting, explained — the other half, signal by signal.
- No-code browser automation — running tasks across many profiles.
- Headless browser detection — a degraded page produces a strange-looking session all by itself.
- Antidetect vs VPN vs incognito — start here if the category itself is new.
Automation that does not announce itself
Parallel gives each profile its own consistent fingerprint and proxy, and its automation types at human speed by default rather than as a setting you have to find. Three profiles free, forever.
Download for Windows