Person or software?
Now you know why.
Tellshield scores every signup, login, or checkout from 0 to 1 and lists the exact reasons, each with its points. Visitors see nothing. Your server makes the decision.
- independent detectors
- 6
- independent detectors
- token lifetime
- 120 s
- token lifetime
- puzzles shown
- 0
- puzzles shown
- Starting point-15
- -10Natural keystroke rhythmbeh.natural_keystrokes
- -10Naturally curved pointer pathsbeh.curved_paths
- -6Pointer micro-corrections presentbeh.micro_corrections
- -5Consistent browser environmentenv.consistent
- -5Residential networknet.consumer
risk = sigmoid((-15 − 36) / 25) = 0.115
Three steps. The score never reaches the browser.
- 01In the browser
The script records timing
Pointer paths, click timing, key timing, and browser properties. Never what was typed.
- 02Before the sensitive action
You call verify
The browser gets a single-use token bound to the action. It expires in 2 minutes.
- 03On your server
You redeem the token
With your secret key. You get the score, a confidence, every reason, and a recommended action.
<script src="https://tellshield.vercel.app/tellshield.js" data-site-key="site_..." data-api-url="https://tellshield-api.fly.dev"></script>
<script type="module">
const { token } = await window.Tellshield.client.verify({ action: "signup" });
</script>// Token from the page that loads https://tellshield.vercel.app/tellshield.js
const response = await fetch("https://tellshield-api.fly.dev/v1/token/verify", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TELLSHIELD_SECRET_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ token, action: "signup" }),
});
const result = await response.json();
if (!result.valid || result.recommended_action === "block") return reject();
if (result.recommended_action === "challenge") return stepUp();
return createAccount();Points in, a number out, nothing hidden.
Six detectors check browser consistency, automation traces, behavior, device, network, and session speed. Signs of software add points. Signs of a person subtract them. The total goes through a sigmoid to give a 0–1 risk.
Let it through.
Let it through, but flag it.
Ask for more proof.
Stop the action.
Add your own rules, like network.type = datacenter → rate_limit. Rules can only make the result stricter. No rule can turn a block into an allow.
We measure how, never what.
- Pointer, click, scroll, and key timingNot which key. Raw events deleted after 30 min.
- Browser propertiesUser agent, screen, timezone, languages, automation traces. 7 days.
- IP address, hashedPlus country, network provider, and type, like residential or datacenter.
- Scores and reasonsWith summary behavior stats. 90 days.
- Field values, passwords, typed textThe script never reads input contents.
- Clipboard contentsOnly that a paste happened.
- Canvas, audio, or font fingerprintsNo hidden device ID.
- Cross-site identifiersNothing follows a person from one site to another.
Add it to one form. See the reasons for every score.
Create an account, copy your site key, and paste in the two snippets above. Your secret key is shown only once and stays on your server.